使用Wildlfy 11嵌入式Apache Artemis接收MQTT消息

时间:2017-12-28 18:36:33

标签: java jboss wildfly mqtt activemq-artemis

我想在Wildfly 11中使用嵌入式Apache Artemis接收MQTT消息。

现状:

  1. 我在Wildfly嵌入式Apache Artemis中添加了MQTT协议支持(添加了&#34;缺少&#34;文件夹和artemis-mqtt-protocol-.jar并在module.xml中启用了协议)< / p>

  2. 我正在使用完整的独立配置并为MTQQ添加了接受器:

  3. <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添加到套接字绑定
    2. 从日志中我可以看到它有效:

        

      AMQ221020:在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:
      2. 
        
            @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发送消息时,我可以在日志中看到:
        2.   

          创建会话:63f14f85-0fa2-4fe7-a27b-03ef8e6639a2

               

          无法找到address = testEndpoint的任何绑定   消息= SERVERMESSAGE [MESSAGEID = 962,耐用=真,用户ID = NULL,优先权= 0,   bodySize = 512,timestamp = 0,expiration = 0,durable = true,   地址= testEndpoint,属性= TypedProperties [mqtt.message.retain =真,mqtt.qos.level = 1]] @ 749653273

               

          信息   SERVERMESSAGE [MESSAGEID = 962,耐用=真,用户ID = NULL,优先权= 0,   bodySize = 512,timestamp = 0,expiration = 0,durable = true,   address = testEndpoint,properties = TypedProperties [mqtt.message.retain = true,mqtt.qos.level = 1]] @ 749653273不会去任何地方,因为它没有绑定   地址:testEndpoint

               

          QueueImpl [名= $ sys.mqtt.retain.testEndpoint,   邮局= PostOfficeImpl   [服务器= ActiveMQServerImpl :: serverUUID = c58c74d5-ea71-11e7-9621-a434d929f4aa]] @ 6ff93fb4   做交付。 messageReferences = 0

          所以看起来我在某个地方缺少一些绑定,但我找不到它会是什么。有人有任何想法吗?

2 个答案:

答案 0 :(得分:1)

日志说明了这一点:

  

AMQ221052:部署主题jms.topic.testEndpoint

它也说:

  

无法找到address = testEndpoint

的任何绑定

因此,在我看来,它是&#34; jms.topic.testEndpoint&#34;之间的简单不匹配。和&#34; testEndpoint&#34;。

答案 1 :(得分:0)

看起来有两个问题:

  1. 在MessageDriven注释中,mappedName由GlassFish和ActivationConfigProperty使用(propertyName =&#34; destination&#34; ...由Wildfly。根据帖子我发现两者都很好。所以正确的格式为:
  2. 
    
        @MessageDriven(                
            mappedName = "testEndpoint", // GlassFish    
            activationConfig = { 
                @ActivationConfigProperty(propertyName = "destination", 
                                          propertyValue = "testEndpoint"),  // Wildfly
                @ActivationConfigProperty(propertyName = "destinationType",                                                      
                                          propertyValue = "javax.jms.Topic")
        })
    
    
    
    1. 在Wildfly配置中,应该将主题的名称对应于整个ie:
    2.   

      &lt; jms-topic name =&#34; testEndpoint&#34;   条目=&#34; / JMS /主题/ testEndpoint&#34; /&GT;