Должен ли идентификатор клиента быть уникальным в одном приложении в Artemis

#java #jms #activemq-artemis

#java #jms #activemq-artemis

Вопрос:

Вот что у меня есть: у нас есть 2 приложения, одно производящее и одно потребляющее. Оба работают на разных JVM. Они отправляют сообщение в постоянную тему и используют один и тот же идентификатор клиента.

Я хотел знать, разрешено ли следующее в спецификации JMS 2.0 и можно ли это сделать в Artemis.

  • На стороне потребителя у меня есть фабрика соединений.
  • Я установил идентификатор клиента на заводе следующими методами при создании экземпляра компонента ActiveMQConnectionFactory: .setClientId("clientId") и .setEnabledSharedClientId(true)
  • Затем у меня есть класс A, который принимает ActiveMQConnectionFactory тип в своих параметрах. В этом классе есть метод отправки, в котором он проверяет, существует ли соединение, если нет, он создает соединение через this.connectionFactory.createConnection(); .
  • Затем у меня есть другой класс, который принимает в нем тип A объекта. В этом классе есть BlockingQueue массив. в каждом элементе он содержит ArrayBlockingQueue . По сути, целью этого класса является создание разных потоков для использования сообщений из ArrayBlockingQueue по мере того, как в них помещаются сообщения. Каждый поток считывает из своего arrayblcokingqueue, который он также назначил в своем собственном потоке.

Теперь мой вопрос в том, разрешено ли это в спецификации JMS 2.0? Нормально ли, что соединение создается в другом потоке, который создается из ОДНОГО И ТОГО ЖЕ ConnectionFactory? Должен ли каждый поток иметь свой собственный идентификатор клиента?

Комментарии:

1. Мой ответ отвечал на ваш вопрос? Если да, пожалуйста, отметьте это как правильное, чтобы помочь другим, у кого может возникнуть этот же вопрос в будущем. Если нет, пожалуйста, уточните, чего не хватает. Спасибо!

Ответ №1:

Как отмечено в разделе 2.14 спецификации JMS 2, javax.jms.ConnectionFactory объект поддерживает одновременное использование. Следовательно, для нескольких потоков вполне нормально использовать одно и то же ConnectionFactory для создания экземпляров javax.jms.Connection .

Что касается идентификатора клиента, это соответствующий бит из раздела 6.1.2 спецификации:

По определению, состояние клиента, идентифицируемое идентификатором клиента, может ‘использоваться’ только одним клиентом одновременно.

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

Поскольку ваши потребители, похоже, совместно используют долгосрочную подписку на тему, то использование идентификатора клиента необязательно.

Также стоит отметить, что org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory#setEnableSharedClientID это действительно внутренний метод, предназначенный для использования в адаптере ресурсов JCA и для определенных случаев, связанных с обратной совместимостью.