WebSphere MQ Q程序使用

时间:2012-07-27 21:06:53

标签: ibm-mq

我使用以下MQSC命令创建了一个队列管理器QM_TEST:

  SET AUTHREC OBJTYPE(QMGR) GROUP('mq-user') AUTHADD(INQ,DSP,CONNECT,SET,SETALL)
  SET AUTHREC PROFILE(SYSTEM.MQEXPLORER.REPLY.MODEL) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(INQ,DSP,GET)
  SET AUTHREC PROFILE(SYSTEM.ADMIN.COMMAND.QUEUE) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(INQ,DSP,PUT)
  DEFINE CHANNEL ($cname) CHLTYPE (SVRCONN) TRPTYPE (TCP) MCAUSER('tcs-mq-user') REPLACE
  SET CHLAUTH($cname) TYPE(ADDRESSMAP) ADDRESS(*) MCAUSER('tcs-mq-user')
  DEFINE QLOCAL ($dlqname) REPLACE
  SET AUTHREC PROFILE($dlqname) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(ALL)
  ALTER  QMGR DEADQ($dlqname) FORCE
  DEFINE LISTENER ($lname) TRPTYPE (TCP) CONTROL (QMGR) PORT ($port)
  START LISTENER ($lname)

我有两个队列TEST1和TEST2使用:

创建
DEFINE QLOCAL ($qname) GET(ENABLED) PUT(ENABLED) MAXDEPTH($maxdepth) REPLACE
SET AUTHREC PROFILE($qname) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(ALL)

我正在尝试使用q程序实用程序将消息从TEST1复制到TEST2:

  

q -xb -mQM_TEST -iTEST1 -mQM_TEST -oTEST2 -p20

但是我收到了这个错误:

  

Paul Clarke的MQSeries Q程序[V6.0.0 Build:May 2 2012]   连接......失败了。对象'QM_TEST'上的MQCONNX返回2035 Not   授权..

我正在运行WebSphere MQ v7.1。 q SupportPac安装在服务器上,我正在服务器上执行q命令。我无法想出一种方法来传递通道名称TEST_CHANNEL和端口号1414,这是问题吗?

1 个答案:

答案 0 :(得分:1)

程序通过共享内存而不是使用SVRCONN通道以绑定模式连接到QMgr。您可以通过ALTER QMGR AUTHOREV(ENABLED)验证这一点,然后查看QMgr事件队列中生成的授权事件。如果已安装SupportPac MS0P,则可以右键单击队列并选择“格式化事件消息”以便以人类可读的格式查看。无论哪种方式,您都应该看到用于连接的ID不是tcs-mq-user,而是用于运行Q程序的ID。尝试:

q -lmqic -xc -iTEST1 -oTEST2 -p20

使用-xc运行时,程序会提示您输入频道详情。

Q程序可以将队列转储到文件,但它不是为此而设计的。来自SupportPac MO03 的QLoad程序是为此设计的,它将捕获邮件的所有方面,如果您获得适当授权,也可以完整地恢复它们。这包括消息ID,时间戳等。

最后,快速了解帖子中的AUTHREC语句。由于您已经打算创建一个低权限MCAUSER并为其设置权限,我认为您希望该ID不具有管理权限。请注意,在QMgr上授予用户+set+setall允许他们使用WMQ Explorer或使用PCF命令的任何其他内容来管理授权记录。考虑将QMgr的权限限制为+dsp +inq +connect

通常,应用程序无法访问DLQ,而是可以访问特定于应用程序的回退队列。如果应用程序被授予访问DLQ的权限,通常只是将消息放在那里而不是让它们退出。这是因为DLQ是系统范围的资源,如果共享QMgr,来自多个应用程序的消息可能会落在DLQ中。作为安全预防措施,请将该队列上的删除访问权限限制为管理员。这样,有人在他们的应用程序清理后不会意外(或以其他方式)删除属于另一个应用程序的邮件。

<强>更新
回顾你的帖子,我注意到了另一个差异。我假设您收到2035授权错误,因为您在绑定模式下使用mqmtcs-mq-user以外的ID进行连接。再看一遍之后,我意识到您从未授权mq-user组到您尝试访问的队列。您将其授权给在此方案中未使用的命令队列和回复模型。 (WMQ Explorer使用它们。)因此,添加以下规则:

SET AUTHREC PROFILE(TEST1) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(PUT,GET,INQ,BROWSE)
SET AUTHREC PROFILE(TEST2) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(PUT,GET,INQ,BROWSE)

如果您实际连接为tcs-mq-user,这将解决身份验证问题。

据我所知,没有办法在命令行上将通道传递给Q,但它确实接受标准的MQSERVER variable。例如:

export MQSERVER="$cname/TCP/localhost($port)"

...其中$cname是频道名称,$port是端口。这是我的测试:

tcs-mq-user:~> export MQSERVER="TEST.SVRCONN/TCP/localhost(1414)"
tcs-mq-user:~> q -xb -iTEST1 -mQMTEST -lmqic
MQSeries Q Program by Paul Clarke [ V6.0.0 Build:May  2 2012 ]
Connecting ...connected to 'JMSDEMO'.
No more messages.
tcs-mq-user:~> 

至于为什么它找不到客户端库,你安装了吗?

tcs-mq-user:~> rpm -qa | grep MQSeriesClient
MQSeriesClient-7.5.0-0