我可以打开集群MQ队列以用Perl编写吗?

我可以打开集群MQ队列以用Perl编写吗?,perl,ibm-mq,Perl,Ibm Mq,如果我在集群中的另一个队列管理器上定义了一个Websphere MQ队列,是否有一种方法可以使用Perl接口打开它进行编写?下面的代码返回mqrc 2085 $messageQ = MQSeries::Queue->new ( QueueManager => $qMgr, Queue => $queue, Options => $o

如果我在集群中的另一个队列管理器上定义了一个Websphere MQ队列,是否有一种方法可以使用Perl接口打开它进行编写?下面的代码返回mqrc 2085

$messageQ = MQSeries::Queue->new
        (
         QueueManager         => $qMgr,
         Queue                => $queue,
         Options              => $openOpt
         ) or die ">>>ERROR2: Unable to open the queue: $queue\n";
}

对!!Perl模块是WMQAPI上的一层薄薄的外衣,公开了所有的基本选项和大多数真正深奥的东西

打开队列时,WebSphere MQ将对您为队列和QMgr名称提供的值执行名称解析。如果同时提供队列和QMgr名称,则对象引用是完全限定的,WMQ将尝试以命名方式打开它。因此,如果您提供的名称是本地QMgr,并且集群队列没有本地定义的实例,则打开将失败,并出现2085未知对象名称

打开集群队列的诀窍是为QMgr名称提供空值。这会导致名称解析在本地QMgr中检查同名队列,然后查找“无”,它会检查群集存储库并解析对群集队列的开放。请注意,队列必须播发到集群才能工作。具体地说,目标队列的CLUSTER或CLUSNL属性必须为非空,并引用源QMgr参与的集群。类似地,目标QMgr还必须与源QMgr参与同一集群

还请注意,如果在打开的位置上指定的QMgr名称不是本地QMgr,则WMQ将仅尝试解析QMgr名称。如果它可以解析到该QMgr的路由,那么它将在那里发送消息。这意味着在集群中,只要知道完全限定名,就可以向任何QMgr上的任何队列发送消息

最后,您可以在集群队列上定义本地别名。例如,如果您在QMGRA和DEF QA(TARGET.QUEUE)TARGQ(TARGET.QUEUE)上,然后在您定义QL(TARGET.QUEUE)集群(MYCLUS)的同一集群中的QMGRB和QMGRC上,则可以打开QMGR=QMGRA QUEUE=TARGET.QUEUE,并且仍能按预期工作。请注意,别名不会播发到集群,但目标队列是。这种方法的唯一问题是,如果集群查询花费的时间太长,第一次打开API调用时可能会失败。在生产环境中执行此操作时,我总是提前在别名上使用amqsput,以便在实际应用程序打开队列之前让QMgr查询存储库。你为什么要这样做?如果安全性是一个问题,您可能不希望将所有应用程序直接授权给群集XMitQ,因为如上所述,它们可以将消息放到群集中任何QMgr上的任何队列上,包括SYSTEM.ADMIN.COMMAND.queue。别名为您提供了挂起授权的位置,并将用户限制到群集中的特定目标


简单地说,请确保在开放调用中提供空QMgr名称,或在集群队列上设置本地别名。有关安全方面的更多信息,请参阅位于

的WMQ安全演示文稿。您能提供一些示例代码吗?添加--我将尝试下面T.Rob的建议。这让我开始--我有一个队列管理器对象,我正在传递它,但在构建它时我去掉了它的名称,这很有效。谢谢。很高兴它有帮助。顺便说一下,谢谢你的问题。我不知道Perl模块已经更新,Hildo不再被列为维护者。我应该经常从岩石下面爬出来!罗布,你有没有可以分享的例子?我在尝试自动取款机,运气不好。不确定问题出在我的代码还是mq端。我所做的谷歌搜索给出了远程端出现错误2085的一些可能原因,但根据技术人员的说法,这些问题并不存在。我没有配置本地qm,它都是远程集群队列。“…还请注意,如果您在打开的队列上指定的QMgr名称不是本地QMgr,则WMQ将仅尝试解析QMgr名称…”我不必使用MQSeries::QueueManager对象打开队列以便MQOPEN k吗