Подписки Wildfly 18, MQTT и подстановочные знаки

Я пытаюсь запустить акцептор MQTT в Apache Artemis на сервере Wildfly 18.

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

Первоначально мне пришлось добавить разрешение create-durable-queue="true" в систему безопасности, иначе, как только я попытаюсь подписаться на эту тему, сервер прекратит связь.

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

Чтобы дать некоторую предысторию варианта использования:

Я хочу использовать встроенный сервер Artemis из Wildfly 18 и иметь несколько устройств, которые публикуют сообщения в таких темах, как /device/reader/SOMEID/temperature и т.п.

В своих EJB-компонентах я хочу подписаться на тему /device/# и получать все сообщения по этой теме и всем подтемам.

Как я могу этого добиться?

Также, когда моя запись в конфиге

<jms-topic name="TestTopic" entries="java:/jms/topic/TestTopic" />

Почему тогда тема MQTT jms/topic/TestTopic? Мне не нравится использовать там префикс.


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


Ответы (1)


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

Если вы используете true для auto-create-addresses address-setting, тогда тема (то есть адрес) должна быть создана для вас автоматически, когда вы отправляете ей сообщение или создаете на нее подписку.

Первоначально мне пришлось добавить к безопасности разрешение create-stable-queue = "true", иначе, как только я попытаюсь подписаться на эту тему, сервер прекратит обмен данными.

Это ожидается, поскольку разрешение create-durable-queue не установлено по умолчанию.

Если вы хотите, чтобы подписчик темы JMS получал все сообщения, отправленные на определенный набор адресов, просто укажите желаемый адрес с подстановочными знаками в своем jms-topic определении в конфигурации сервера или в коде. Последнюю документацию по ActiveMQ Artemis можно найти здесь и пример его использования здесь.

Почему тема MQTT стоит тогда jms / topic / TestTopic? Мне не нравится использовать там префикс.

К сожалению, префикс не является обязательным в Wildfly из-за исторических проблем с обратной совместимостью. Кроме того, хотя для встроенного экземпляра ActiveMQ Artemis технически возможно обслуживать клиентов, не относящихся к JMS, встроенный брокер на самом деле предназначен только для того, чтобы служить реализацией JMS, как того требует Java EE. У вас будет больше гибкости (т.е.возможность не использовать вышеупомянутый префикс), если вы запустите ActiveMQ Artemis в автономном режиме.

person Justin Bertram    schedule 28.10.2019
comment
Спасибо, я добавил auto-create-jms-queues="true" auto-create-queues="true" auto-create-addresses="true" в свою конфигурацию. И теперь я получаю сообщения. Мне было не совсем понятно, какие были разделители / или . и должен ли подстановочный знак быть # или >. Теперь мне нужно выяснить, по какой теме он был опубликован. Сообщения, которые я получаю через MQTT, относятся к типу ActiveMQDestination, а не к теме, так как мне получить имя? - person Mauli; 28.10.2019
comment
Как отмечено в схеме, auto-create-jms-queues устарел в пользу auto-create-queues и auto-create-addresses. Я не понимаю, что вы говорите о сообщениях, которые вы получаете через MQTT, относятся к типу ActiveMQDestination. Класс ActiveMQDestination является частью реализации JMS и не имеет ничего общего с MQTT. Похоже, это может быть новый / другой вопрос, который, вероятно, лучше всего подойдет для нового сообщения. - person Justin Bertram; 28.10.2019
comment
Теперь у меня есть MDB, который слушает TestTopic.#. Это прекрасно работает. В целях тестирования я создал планировщик, который отправляет сообщения в TestTopic и TestTopic.subtopic, и это нормально. В сообщении destination имеет тип Topic. Все в порядке. Когда я публикую по тем же темам через MQTT (например, jms/topic/TestTopic), тогда пункт назначения имеет только тип Destination (в частности, ActiveMQDestination), а не Topic. А поскольку у Destination нет названия, как мне узнать название темы? Я хочу избежать вызова getName () или getAddress через отражение. - person Mauli; 28.10.2019
comment
Как отмечено в JavaDoc для Destination, в нем нет собственные методы и 4 подинтерфейса - Queue, TemporaryQueue, TemporaryTopic, Topic. Чтобы получить имя, не требуется отражения. Просто сделайте if (destination instanceof Topic) {name = ((Topic)destination).getTopicName();}. - person Justin Bertram; 28.10.2019
comment
Вот почему я сказал, что сообщение, которое я получаю через MQTT, не имеет в своем месте назначения ни темы, ни очереди. Когда я отправляю сообщение в wildfly через JMS, я получаю org.apache.activemq.artemis.jms.client.ActiveMQTopic в качестве пункта назначения, но когда он публикуется через MQTT, я получаю org.apache.activemq.artemis.jms.client.ActiveMQDestination, который не реализует ни один из них. - person Mauli; 28.10.2019
comment
Если у вас есть реализация Destination, которая не реализует ни Queue, ни Topic, то получить имя через JMS API невозможно. Однако вы можете получить имя от org.apache.activemq.artemis.jms.client.ActiveMQDestination с помощью метода getName(). - person Justin Bertram; 28.10.2019