为单个订阅提供服务的多个进程会导致MQRC_SUBSCRIPTION_IN_USE

时间:2013-09-17 15:05:07

标签: jms ibm-mq mq tibco businessworks

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

我遇到的问题是第一台开始监听SUBSCRIBE.A的服务器挂钩很好。运行完全相同进程的其他3个服务器收到错误“WebSphere MQ调用失败,带有compcode'2'('MQCC_FAILED')原因'2429'('MQRC_SUBSCRIPTION_IN_USE')”

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

如何让群集中的所有4台服务器为订阅SUBSCRIBE.A提供服务?

2 个答案:

答案 0 :(得分:4)

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

也就是说,WebSphere MQ确实提供了特定于供应商的选项,允许您执行所需操作:请参阅CLONESUPP连接工厂属性。这在CLONESUPP properties页面的信息中心中有记录。

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

答案 1 :(得分:2)

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

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

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