我想在Wildfly 11中接收带有嵌入式Apache Artemis的MQTT消息。
当前状态:
-
我将MQTT协议支持添加到wildfly嵌入的Apache Artemis(添加了"缺失"文件夹和Artemis-Mqtt-protocol-.jar,并在模块中启用了该协议。xml)
-
我正在使用完整的独立配置,并为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"/>
- 还将MQTT添加到插座绑定
从日志中我可以看到它有效:
AMQ221020:在协议[MQTT]
的127.0.0.1:1883启动受体AMQ221007:服务器现在为实时AMQ221001:Apache Activemq Artemis 消息经纪1.5.5.5.jbossorg-008
AMQ221003:部署队列JMS.Queue.dlq
wflymsgamq0002:绑定的消息对象到jndi名称 java:/connection -factory
AMQ221003:部署队列
wflymsgamq0002:绑定的消息对象到jndi名称 Java:JBOSS/导出/JMS/remoteConnectionFactory
amq221052:部署主题jms.topic.testendpoint
- 接下来我写了一个简单的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());
}
}
}
- 我可以连接到端口1883上的服务器,当我向TENTENDPOINT发送消息时,我可以在日志中看到:
创建的会话:63F14F85-0FA2-4FE7-A27B-03EF8E6639A2
找不到地址的任何绑定= testendpoint messages = serverMessage [messageId = 962,durable = true,userId = null,Priority = 0, 身体= 512,时间戳= 0,到期= 0,耐用= true, 地址= testendpoint,properties = typedproperties [mqtt.message.train = true,mqtt.qos.level = 1]]@749653273
消息 serverMessage [messageId = 962,耐用= true,userId = null,Priority = 0, 身体= 512,时间戳= 0,到期= 0,耐用= true, 地址= testendpoint,properties = typedProperties [mqtt.message.train = true,mqtt.qos.level = 1]]@749653273无处不在 地址:TESTENDPOINT
queueimpl [name = $ sys.mqtt.retain.testendpoint, 邮局=邮局 [server = activemqserverimpl :: serveruuid = c58c74d5-ea71-11e7-9621-a434d929f4aa]]@6ff93fb4 交付。MessagereFerences = 0
所以我看来我在某个地方缺少一些绑定,但我找不到它会是什么。有人有任何想法吗?
日志说:
amq221052:部署主题jms.topic.testendpoint
也说了这一点:
找不到任何绑定= testendpoint
所以在我看来,这是" jms.topic.testendpoint"one_answers" testendpoint"之间的简单不匹配。
看起来有两个问题:
- 在MessagedRiven注释中,MappedName使用glassfish和activationConfigproperty(propertyName =" destinate =" destination")由Wildfly。根据帖子,我发现两者都很好。因此,正确的格式为:
@MessageDriven(
mappedName = "testEndpoint", // GlassFish
activationConfig = {
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "testEndpoint"), // Wildfly
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Topic")
})
- 在Wildfly配置中,一个主题的名称应与整个IE相对应:
&lt; jms-topic名称='testendpoint&quot&quot&quot 条目=&quot; jms/topic/testendpoint&quort&quord&gt;