You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:57:02