Spring Boot远程连接WildFly中ActiveMQ Artemis Topic故障排查
Spring Boot 2.7.17 连接 WildFly 26.1.3 内置 ActiveMQ Artemis Topic 收发问题解决
问题背景
需从独立Spring Boot 2.7.17应用,向WildFly 26.1.3内置的ActiveMQ Artemis的Topic收发非持久订阅消息。基于artemis-demo项目改造,指定唯一Bean名称避免Spring Boot默认实现,队列可正常收发,但Topic仅能在Spring Boot实例间互通,WildFly内监听器收不到消息,且控制台无法看到创建的Topic。
配置代码
JmsConfig 配置
@Bean(name = {"test2.jmsConnectionFactory"}) public ConnectionFactory connectionFactory() throws Exception { return externalActiveMQXAConnectionFactory(); } /** * ActiveMQ XA Connection factory. * * @return the connection factory * @throws Exception the exception */ @Bean(name = { "test2.externalActiveMQXAConnectionFactory" }) public ActiveMQConnectionFactory externalActiveMQXAConnectionFactory() throws Exception { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); factory.setBrokerURL(activeMQBrokerURL); factory.setUser(activeMQUserName); factory.setPassword(activeMQPassword); factory.setDeserializationWhiteList("*"); return factory; } @Bean (name = "test2.queueConnectionFactory") public JmsListenerContainerFactory<?> queueConnectionFactory(@Qualifier("test2.jmsConnectionFactory") ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setPubSubDomain(false); return factory; } @Bean (name = "test2.topicConnectionFactory") public JmsListenerContainerFactory<?> topicConnectionFactory(@Qualifier("test2.jmsConnectionFactory") ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setPubSubDomain(true); return factory; } @Bean(name = "test2.queueJmsTemplate") public JmsTemplate queueJmsTemplate(@Qualifier("test2.jmsConnectionFactory") ConnectionFactory connectionFactory) throws Exception{ JmsTemplate template = new JmsTemplate(); template.setConnectionFactory(connectionFactory); template.setSessionTransacted(true); return template; } @Bean(name = "test2.topicJmsTemplate") public JmsTemplate topicJmsTemplate(@Qualifier("test2.jmsConnectionFactory") ConnectionFactory connectionFactory) throws Exception{ JmsTemplate template = new JmsTemplate(); template.setConnectionFactory(connectionFactory); template.setSessionTransacted(true); template.setPubSubDomain(true); return template; }
ReceiverService 代码
@JmsListener(destination = "${test2.receiver.queue.name2}", containerFactory = "test2.queueConnectionFactory") public void consume(String message) { log.info("Received Message Queue on queue {test2.queue.name2}: " + message); } @JmsListener(destination = "${test2.receiver.topic.name}", containerFactory = "test2.topicConnectionFactory") public void consumeTopic(String message) { log.info("Received Message Topic on topic {test2.topic.name}: " + message); }
DispatcherService 代码
public void sendToQueue(String message){ queueJmsTemplate.convertAndSend(queueName, message); log.info("Queue Message Sent: " + message); } public void sendToTopic(String message) { topicJmsTemplate.convertAndSend(topicName, message); log.info("Topic Message Sent: " + message); }
application.properties 配置
test2.spring.artemis.mode=native test2.spring.artemis.user=XXX test2.spring.artemis.password=XXXXX test2.spring.artemis.broker-url=tcp://XXXX:PPP?httpUpgradeEnabled=true test2.queue.name=mail test2.receiver.queue.name=mail test2.topic.name=integrationEvent test2.receiver.topic.name=integrationEvent
问题现象
- 队列可远程正常收发,但WildFly内监听器收不到消息,仅Spring Boot实例间轮询接收。
- Topic仅创建临时Topic(WildFly管理控制台不可见),仅能在Spring Boot实例间互通,WildFly内监听器无法接收消息;但WildFly内部应用向自身Topic发消息正常。
问题定位与解决
问题根源在于队列/Topic的命名匹配错误。
查看WildFly的standalone-full.xml中JMS资源定义:
<jms-queue name="testQueue" entries="java:/jms/queue/test java:jboss/exported/jms/queue/test"/> <jms-topic name="testTopic" entries="java:/jms/topic/test java:jboss/exported/jms/topic/test"/>
在WildFly控制台中,实际的Queue地址为jms.queue.testQueue,Topic地址为jms.topic.testTopic。
修正方法
将Spring Boot配置文件中的队列/Topic名称替换为WildFly控制台显示的实际地址:
# 替换原有队列/Topic配置 test2.queue.name=jms.queue.testQueue test2.receiver.queue.name=jms.queue.testQueue test2.topic.name=jms.topic.testTopic test2.receiver.topic.name=jms.topic.testTopic
修改后,Spring Boot应用即可与WildFly内置的ActiveMQ Artemis的队列/Topic正常通信,WildFly内的监听器也能接收到消息。
内容的提问来源于stack exchange,提问作者Mike Rother
相关产品推荐
相关产品推荐

