Получение сообщения MQTT с помощью Wildlfy 11, встроенного в Apache Artemis

Я хотел бы получать сообщения MQTT в Wildfly 11 со встроенным Apache Artemis.

Текущее состояние:

  1. Я добавил поддержку протокола MQTT во встроенный Apache Artemis Wildfly (добавил "отсутствующую" папку и artemis-mqtt-protocol-.jar и включил протокол в файле module.xml)

  2. Я использую полную автономную конфигурацию и добавлен приемник для MTQQ:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
  <server name="default">
        <remote-acceptor name="mqtt-acceptor" socket-binding="mqtt">
          <param name="protocols" value="MQTT"/>
        </remote-acceptor>

и тема как:

<jms-topic name="testEndpoint" entries="java:/jms/testEndpoint"/>
  1. Также добавлен mqtt для привязки сокета

Из журнала видно, что это работает:

AMQ221020: Acceptor запущен на 127.0.0.1:1883 для протоколов [MQTT]

AMQ221007: сервер запущен AMQ221001: Apache ActiveMQ Artemis Message Broker версия 1.5.5.jbossorg-008

AMQ221003: развертывание очереди jms.queue.DLQ

WFLYMSGAMQ0002: привязанный объект обмена сообщениями к jndi с именем java: / ConnectionFactory

AMQ221003: развертывание очереди jms.queue.ExpiryQueue

WFLYMSGAMQ0002: привязанный объект обмена сообщениями к имени jndi java: jboss / exported / jms / RemoteConnectionFactory

AMQ221052: Развертывание темы jms.topic.testEndpoint

  1. Затем я написал простой MDB как:


    @MessageDriven(
            activationConfig = { @ActivationConfigProperty(propertyName = "destination", 
                                                           propertyValue = "testEndpoint"), 
                                 @ActivationConfigProperty(propertyName = "destinationType", 
                                                           propertyValue = "javax.jms.Topic")
            },
            mappedName = "testEndpoint")
    public class TestEndpoint implements MessageListener {

        private static final Logger logger = Logger.getLogger(TestEndpoint.class.getName());

        public void onMessage(Message message) {
            try {
                logger.debug("message: " + message.getClass().getName());
            } catch (Exception e) {
                logger.debug("exception: " + e.getMessage());
            }
        }

    }

  1. Я могу подключиться к серверу через порт 1883, и когда я отправляю сообщение в testEndpoint, я вижу в журналах:

СОЗДАНА СЕССИЯ: 63f14f85-0fa2-4fe7-a27b-03ef8e6639a2

Не удалось найти никаких привязок для address = testEndpoint в сообщении = ServerMessage [messageID = 962, Durable = true, userID = null, priority = 0, bodySize = 512, timestamp = 0, expiration = 0, Durable = true, address = testEndpoint , properties = TypedProperties [mqtt.message.retain = true, mqtt.qos.level = 1]] @ 749653273

Сообщение ServerMessage [messageID = 962, Durable = true, userID = null, priority = 0, bodySize = 512, timestamp = 0, expiration = 0, Durable = true, address = testEndpoint, properties = TypedProperties [mqtt.message.retain = true , mqtt.qos.level = 1]] @ 749653273 никуда не денется, так как у него не было привязки к адресу: testEndpoint

QueueImpl [name = $ sys.mqtt.retain.testEndpoint, postOffice = PostOfficeImpl [server = ActiveMQServerImpl :: serverUUID = c58c74d5-ea71-11e7-9621-a434d929f4aa]] @ 6ff93fb4 выполняет доставку. messageReferences = 0

Похоже, что где-то не хватает какой-то привязки, но я не могу найти, что это было бы. У кого-нибудь есть идеи?


person sposnjak    schedule 28.12.2017    source источник


Ответы (2)


В журнале написано следующее:

AMQ221052: Развертывание темы jms.topic.testEndpoint

И еще там сказано:

Не удалось найти привязки для address = testEndpoint

Мне кажется, что это простое несоответствие между jms.topic.testEndpoint и testEndpoint.

person Justin Bertram    schedule 29.12.2017
comment
кажется очень похожим на stackoverflow.com/a/42436226/160799 - person Gregor; 03.01.2018

Похоже, возникли две проблемы:

  1. В аннотации MessageDriven mappedName используется GlassFish и ActivationConfigProperty (propertyName = "destination" ... Wildfly. Согласно сообщению, я обнаружил, что оба в порядке. Итак, правильный формат выглядит следующим образом:


    @MessageDriven(                
        mappedName = "testEndpoint", // GlassFish    
        activationConfig = { 
            @ActivationConfigProperty(propertyName = "destination", 
                                      propertyValue = "testEndpoint"),  // Wildfly
            @ActivationConfigProperty(propertyName = "destinationType",                                                      
                                      propertyValue = "javax.jms.Topic")
    })


  1. В конфигурации Wildfly необходимо, чтобы название темы соответствовало всему, т.е.

‹Имя темы jms = записи testEndpoint = / jms / topic / testEndpoint /›

person sposnjak    schedule 07.01.2018