5

我有一个发布到 JMS 主题的 TIBCO BusinessWorks 流程——我们称之为 TOPIC.A——有一个进程订阅该主题,其名称为 SUBSCRIBE.A。

我遇到的问题是第一个开始收听 SUBSCRIBE.A 的服务器很好地挂钩。运行完全相同的进程的其他 3 台服务器收到错误“WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2429' ('MQRC_SUBSCRIPTION_IN_USE')”

对于企业软件来说,这不是合理的行为,而且我知道 WebsphereMQ、JMS 和 TIBCO Businessworks 都可以很好地扩展,所以我一定遗漏了一些东西。我只希望每个事件处理一次,但一个盒子不会这样做,无论是出于故障转移原因还是剪切量原因。

我需要做什么才能让集群中的所有 4 台服务器为订阅 SUBSCRIBE.A 提供服务?

4

2 回答 2

4

我同意这对于企业软件来说似乎不是合理的行为——但这种限制是由 JMS 规范强加的。JMS 1.1 规范第 6.66.1 节说“一次只能有一个会话可以有一个特定持久订阅的 TopicSubscriber”。

也就是说,WebSphere MQ 确实提供了一个特定于供应商的选项,允许您做您想做的事情:请参阅CLONESUPPConnection Factory 属性。这记录在CLONESUPP属性页面的信息中心中。

虽然它是特定于 MQ 的,但如果您使用管理对象指定它,您的代码将不需要使用任何供应商特定的方法。

于 2013-09-18T18:54:21.390 回答
2

MQRC 2429 的原因是因为所有 4 个订阅者都在使用相同的客户端 ID,并且都在尝试使用相同的持久订阅。当订阅者已经在积极地监听持久订阅时,没有其他订阅者可以监听。如果您希望所有订阅者同时收听,则为每个订阅者设置单独的客户端 ID。

但是您必须注意,所有订阅者都将获得由发布者(在您的情况下为 TIBCO BusinessWorks)发布的同一消息的副本。因此,如果所有订阅者都处于活动状态,那么所有订阅者都会处理该事件。

对于故障转移,您可以考虑使用 WebSphere MQ 多实例队列管理器功能或任何其他 HA 解决方案。对于负载共享,您可以查看 WebSphere MQ 集群功能。

于 2013-09-18T00:34:57.193 回答