Общий подписчик jms 2

Я видел некоторые проблемы в нашем приложении, когда два экземпляра приложения получали одно и то же сообщение, даже если их потребители были созданы с использованием createSharedConsumer и имели одинаковое имя подписки.

Сначала я подумал, что это может быть наше приложение или способ, которым мы использовали SpringJMS, поэтому я создал пример приложения, которое создает 3 фабрики соединений. Затем эти фабрики используются для создания сообщения, отправляемого в тему и двум прослушивателям в одном приложении (но поскольку они используют другую фабрику соединений и идентификатор клиента, они должны быть полностью разделены), но все же оба прослушивателя сообщений для двух подключений получают сообщение.

Я попытался запустить это против 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, указал мне на то, чего мне не хватает?

1 ответ

Похоже, у меня должен быть RTFM. Из спецификации JMS 2.0:

"Общая недолговременная подписка идентифицируется по имени, указанному клиентом, и по идентификатору клиента, если он установлен. Если идентификатор клиента был задан при создании общей недлительной подписки, то клиент, который впоследствии желает создать потребителя в этой общей недлительной подписке должен использоваться один и тот же идентификатор клиента."

Поэтому, поскольку несколько клиентов не могут иметь один и тот же идентификатор клиента, вам не следует устанавливать идентификатор клиента, если вы хотите использовать общие подписки (долгосрочные или недлительные).

Другие вопросы по тегам