我有一个微服务,它订阅了WebSphere MQ中的topic
。订阅为managed
和durable
。我明确地设置了subscription name
,以便在从任何微服务故障中恢复之后,它可以用于连接回队列。订阅按预期工作。
但我可能需要扩展微服务并运行多个实例。在这种情况下,我最终会有多个消费者参与同一主题。但是这里失败了,错误为2429 : MQRC_SUBSCRIPTION_IN_USE
。我无法为主题订阅运行多个消费者。注意:消息应仅发送给其中一个消费者。
有什么想法?
IBM Websphere版本:7.5 我使用C-client API连接到MQ。
答案 0 :(得分:7)
使用订户时,您所描述的内容仅通过IBM MQ Classes for JMS API支持。在v7.0及更高版本中,您可以使用克隆订阅(这是JMS规范的IBM扩展),此外,在MQ v8.0及更高版本中,您还可以使用共享订阅,这是JMS 2.0规范的一部分。使用这两个选项,可以将多个订阅者连接到同一订阅,并且只有其中一个订阅者将接收每个已发布的消息。
更新20170710
根据此APAR IV96489: XMS.NET DOESN'T ALLOW SHARED SUBSCRIPTIONS EVEN WHEN CLONESUP PROPERTY IS ENABLED,XMS.NET也应支持克隆订阅,但由于存在缺陷,直到8.0.0.8或9.0.0.2才会支持,或者如果您请求IFIX APAR以上。
您可以通过将微服务转换为从队列中获取而不是订阅主题来完成与其他API类似的操作。
要将已发布的消息发送到队列,您有两个选择:
在队列管理器上设置管理订阅。你可以用几种不同的方式做到这一点。下面的示例将使用MQSC命令。
DEFINE SUB('XYZ') TOPICSTR('SOME/TOPIC') DEST(SOME.QUEUE)
创建一个可以打开队列并使用提供的队列创建持久订阅的实用程序应用程序,此应用程序的唯一目的是订阅和取消订阅提供的队列,它不会被用于消耗任何已发布的消息。
使用上述方法,每个发布的消息只能由一个进程或线程从队列中读取(GET)。