Получаване на MQTT съобщение с Wildlfy 11 вграден Apache Artemis

Бих искал да получавам MQTT съобщения в Wildfly 11 с вградения Apache Artemis.

Сегашно състояние:

  1. Добавих поддръжка на MQTT протокол към вградения в Wildfly Apache Artemis (добавих „липсващата“ папка и 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

Не можах да намеря никакви обвързвания за адрес=testEndpoint на message=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

Message 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

И също така казва това:

Не можах да намеря никакви обвързвания за адрес=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-topic name=testEndpoint entries=/jms/topic/testEndpoint/›

person sposnjak    schedule 07.01.2018