1

我在我们的应用程序中看到了一些问题,其中应用程序的两个实例接收到相同的消息,即使它们的消费者是使用 createSharedConsumer 创建的并且具有相同的订阅名称。

起初我认为这可能是我们的应用程序或我们使用 SpringJMS 的方式,所以我创建了一个示例应用程序,它创建了 3 个连接工厂。然后,这些工厂用于创建发送到同一应用程序中的主题和两个侦听器的消息(但由于它们使用不同的连接工厂和客户端 ID,它们应该完全分开),但两个连接的两个消息侦听器仍在接收消息。

我已经尝试对 HornetQ 和 Tibco 运行这个并得到相同的结果。

在实现 MessageListener 的类中创建如下消息消费者

Connection connection = factory.createConnection(userName, password);
Session session = connection.createSession();
MessageConsumer topicReceiver = session.createSharedConsumer(topic, SUBSCRIPTION_NAME);
topicReceiver.setMessageListener(this);
connection.start();

是否有人成功使用了 JMS 2.0 中的共享消费者,并指出我所缺少的方向?

4

1 回答 1

0

看起来我应该有 RTFM。从 JMS 2.0 规范:

"共享的非持久订阅由客户端指定的名称和客户端标识符(如果已设置)标识。如果在首次创建共享非持久订阅时设置了客户端标识符,则随后希望创建消费者的客户端在该共享的非持久订阅上,必须使用相同的客户端标识符。 "

因此,由于多个客户端不能具有相同的客户端标识符,如果您希望使用共享订阅(持久或非持久),则不应设置客户端标识符。

于 2016-01-04T11:09:24.660 回答