我可以打开一个集群MQ队列以便在Perl中编写吗?

时间:2010-05-27 20:26:38

标签: perl ibm-mq

如果我在集群中的另一个队列管理器上定义了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";
}

1 个答案:

答案 0 :(得分:3)

是的! 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调用时可能会失败。当我在Production中执行此操作时,我总是提前在别名上使用amqsput,以便在实际应用程序打开队列之前使QMgr查询存储库。你为什么要这样做?如果安全性是一个问题,您可能不希望将所有应用程序直接授权到群集XMitQ,因为如上所述,他们可以将消息放入群集中任何QMgr上的任何队列,包括SYSTEM.ADMIN.COMMAND.QUEUE。别名为您提供了挂起授权并将用户限制到群集中特定目标的位置。

如此简短的回答,请确保在Open调用中提供null QMgr名称或在群集队列上设置本地别名。有关此安全性方面的更多信息,请参阅http://t-rob.net/links

上的WMQ Security演示文稿