是的!Perl 模块是 WMQ API 的薄薄的一层,并且公开了所有基本选项和大多数真正深奥的东西。
当您打开队列时,WebSphere MQ 对您为 Queue 和 QMgr 名称提供的值执行名称解析。如果您同时提供 Queue 和 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) 上,然后在同一集群中的 QMGRB 和 QMGRC 上,则 DEF QL(TARGET.QUEUE) CLUSTER(MYCLUS) 则可以打开 QMGR =QMGRA QUEUE=TARGET.QUEUE 并且仍然按预期工作。请注意,别名不会通告给集群,但目标队列是。这种方法的唯一问题是,第一次打开时,如果集群查询时间过长,API 调用可能会失败。当我在生产环境中执行此操作时,我总是提前在别名上使用 amqsput,以使 QMgr 在实际应用程序打开队列之前查询存储库。你为什么要这样做?如果安全是一个问题,您可能不想将所有应用程序直接授权给集群 XMitQ,因为如上所述,集群中任何 QMgr 上的任何队列,包括 SYSTEM.ADMIN.COMMAND.QUEUE。别名为您提供了一个地方来挂起授权并将用户限制到集群中的特定目的地。
如此简短的回答,请确保在 Open 调用中提供空 QMgr 名称或在集群队列上设置本地别名。有关此安全方面的更多信息,请参阅http://t-rob.net/links上的 WMQ 安全演示