首页 > 解决方案 > IBM MQ - 我无法使用通配符语法订阅主题

问题描述

我在 IBM MQ docker 版本上创建了以下主题:

开发/测试/sys1 开发/测试/sys2

我正在尝试使用以下代码从 XMS .NET API 创建订阅者:

目的地 = sessionWMQ.CreateTopic("dev/test/#");

出现以下异常,它与基于权限的“原因:2035”有关,但我无法弄清楚我必须授予什么权限以及从哪里授予

XMSException 捕获:IBM.XMS.IllegalStateException:无法使用 MQSUB 订阅主题 dev/#。由于另一个消息使用者正在使用它,因此创建订阅可能存在问题。在尝试以相同名称创建新订阅之前,请确保关闭使用此订阅的所有消息使用者。请参阅链接的异常以获取更多信息。

标签: ibm-mq

解决方案


如果您收到错误 2035 (MQRC_NOT_AUTHORIZED),队列管理器错误日志中将有相应的消息AMQERR01.LOG。它会说这样的话:-

AMQ8009: Entity 'mqgusr1' has insufficient authority to access topic string
'dev/test/#'.

EXPLANATION:
The specified entity is not authorized to access the required topic. The
following requested permissions are unauthorized: sub
ACTION:
Ensure that the correct level of authority has been set for this entity against
appropriate topic objects, or ensure that the entity is a member of a privileged
group. 

具体来说,此错误消息将告诉您用户 ID、对象名称和缺少的授权。使用这些信息,您几乎可以构建您需要的命令。您确实需要更多信息,那就是您希望授予权限的用户所在的组名。始终建议您在授予权限时使用组名而不是用户名,否则您最终可能会获得太多权限来管理,或者更糟的是,由于主要组用户就像“员工”。

这是命令,假设我的错误消息中的“mqgusr1”位于组“mqgapp”中,并且该组适合被授予订阅主题的权限。

SET AUTHREC PROFILE(SYSTEM.BASE.TOPIC) OBJTYPE(TOPIC) GROUP('mqgapp') AUTHADD(SUB)

在这一点上值得一提的是,将主题相关权限添加到 SYSTEM.BASE.TOPIC 会导致相关组能够使用任何可用主题 - 该对象代表主题树的根。如果您希望仅限制对主题树的某些部分的访问(推荐),那么您应该为要使用的主题树的部分创建一个主题对象,然后在那里授予权限,因此以下命令:

SET AUTHREC PROFILE(SYSTEM.BASE.TOPIC) OBJTYPE(TOPIC) GROUP('mqgapp') AUTHRMV(SUB)
DEFINE TOPIC(DEV.TEST) TOPICSTR('dev/test')
SET AUTHREC PROFILE(DEV.TEST) OBJTYPE(TOPIC) GROUP('mqgapp') AUTHADD(SUB)

推荐阅读