Могут ли производители иметь один и тот же clientId и публиковать в теме в Artemis?

Мне было интересно, возможно ли, чтобы несколько производителей использовали один и тот же clientId для отправки сообщений в устойчивую тему. А что произойдет со стороны потребителя, если идентификатор клиента будет таким же, как и на стороне производителя, но имя подписки будет другим?

Например. Производитель имеет clientId 123abc и отправляет сообщения в устойчивую тему. Потребитель подписан на эту постоянную тему, и у этого потребителя есть clientId 123abc, но также значение subscriptionName abc123? Сможет ли потребитель по-прежнему уловить сообщение? Что бы произошло, если бы я добавил еще одного потребителя?


person artemis123321    schedule 17.08.2020    source источник
comment
Я отвечал на ваш вопрос? Если да, отметьте его как правильное, чтобы помочь другим, у кого может возникнуть этот же вопрос в будущем. Если нет, пожалуйста, поясните, чего не хватает. Спасибо!   -  person Justin Bertram    schedule 12.02.2021


Ответы (2)


В разделе 6.1.2 спецификации JMS 2 говорится:

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

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

Тем не менее, нет никакого смысла устанавливать идентификатор клиента для соединения, которое используется только для создания сообщений. В разделе 6.1.2 спецификации JMS 2 также говорится:

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

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

person Justin Bertram    schedule 17.08.2020
comment
Итак, когда мы создаем несколько соединений с фабрики (и каждое соединение имеет clientId 123abc), тот факт, что .createConnection() поддерживает одновременное использование, означает ли это, что каждое соединение будет по существу ждать, поскольку только одно соединение будет активным? (Я где-то это читал). - person artemis123321; 17.08.2020
comment
Как только вы попытаетесь создать соединение с повторяющимся значением идентификатора клиента, будет выдано исключение. Ожидания не будет. - person Justin Bertram; 17.08.2020

У двух подписчиков не может быть одного и того же клиента: когда они оба попытаются подключиться к брокеру, второй перейдет в режим исключения. Однако вы можете переопределить clientid: используя TomEE или Tomcat, вы можете добавить простую строку в system.properties файл следующим образом:

<classname>.activation.clientId=<newclientid>

Для производителей это не проблема.

person Renato    schedule 17.08.2020
comment
Применяется ли переопределение идентификатора клиента TomEE / Tomcat к ActiveMQ Artemis? - person Justin Bertram; 17.08.2020
comment
Да. Я работаю со старой версией Artemis: ActiveMQ, но думаю, что то же самое. - person Renato; 17.08.2020
comment
Что вы имеете в виду, что работаете со старой версией Artemis: ActiveMQ? Вы хотите сказать, что работаете с ActiveMQ 5.x? Если это так, то эти два брокера совершенно разные, и я бы не ожидал, что конфигурация одного будет работать для другого. - person Justin Bertram; 17.08.2020
comment
Я думаю, что это то же самое, потому что это стандартный API JMS - person Renato; 17.08.2020
comment
И ... это не конфигурация сервера или брокера, это конфигурация клиента ... - person Renato; 17.08.2020
comment
javax.jms.Connection#setClientID , конечно, является частью JMS API, но в вашем ответе описан способ его установки через системные свойства. Это часть спецификации JMS? Кроме того, каждый брокер JMS, о котором я знаю, поставляет свою собственную реализацию клиента, так что пользователи могут фактически подключаться к брокеру. Следовательно, особенности конфигурации одного не обязательно применимы к другому. - person Justin Bertram; 17.08.2020