我在我们的应用程序中看到了一些问题,即应用程序的两个实例接收到了相同的消息,尽管它们的使用者是使用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中的共享消费者,为我指明了我所缺少的方向?
看起来我应该有RTF。来自JMS 2.0规范:
"共享的非持久订阅由客户端和客户端标识符(如果设置的话)。如果客户端标识符是在首先创建共享的非持久订阅,然后创建客户端随后希望在共享的非耐用产品上创建一个消费者订阅必须使用相同的客户端标识符"
因此,由于多个客户端不能具有相同的客户端标识符,如果您希望使用共享订阅(持久或不持久),则不应设置客户端标识符。