WildFly部署Spring应用启动时Artemis Topic日志泛滥原因排查
这个重复日志的问题,本质是Spring Boot的Artemis自动配置逻辑和WildFly内置的ActiveMQ Artemis实例之间的交互冲突,具体有两种常见触发场景:
动态目的地的重复创建请求:
当你使用@JmsListener时,Spring默认会检查目标目的地(也就是my-topic)是否存在。如果不存在,Spring会自动发送动态创建请求给Artemis服务器。WildFly的Artemis每次收到这个创建请求,就会打印AMQ221052: Deploying topic jms.topic.my-topic的日志。而Spring在启动阶段的监听器容器初始化过程中,可能会多次触发这个检查/创建逻辑,导致日志重复刷屏。Spring Boot自动配置的残留逻辑:
你用的spring-boot-starter-artemis依赖默认会配置嵌入式Artemis实例,但部署到WildFly时,Spring实际会复用服务器提供的Artemis实例,但自动配置的一些残留逻辑仍然在重复尝试初始化目的地相关资源,从而触发服务器端的重复部署日志。
解决方案1:禁用Spring Boot的Artemis自动配置
既然WildFly已经提供了完整的JMS服务,完全不需要Spring Boot来管理Artemis实例或初始化相关资源。直接在你的Spring Boot主类上排除Artemis的自动配置类即可:
@SpringBootApplication(exclude = ArtemisAutoConfiguration.class) public class YourSpringBootApp { public static void main(String[] args) { SpringApplication.run(YourSpringBootApp.class, args); } }
解决方案2:在WildFly中静态部署my-topic
提前在WildFly中配置好这个topic,让Spring启动时直接使用已存在的静态资源,避免动态创建请求:
- 登录WildFly管理控制台(默认地址:
http://localhost:9990) - 依次进入 Configuration > Messaging > ActiveMQ Artemis > Server > Topics
- 点击「Add」按钮,创建名为
my-topic的topic,确保JNDI名称和你@JmsListener中指定的destination匹配(比如jms/topic/my-topic) - 重启WildFly后,Spring应用启动时就不会再触发动态部署日志了。
解决方案3:配置Spring禁止自动创建目的地
在application.properties(或application.yml)中添加以下配置,告诉Spring不要尝试动态创建JMS目的地:
# 禁用嵌入式Artemis spring.artemis.embedded.enabled=false # 使用WildFly提供的原生Artemis实例 spring.artemis.mode=native # 禁止自动创建队列/主题 spring.jms.properties.amq.createqueues=false spring.jms.properties.amq.createtopics=false
以上三种方案任选其一即可,测试后你会发现重复的部署日志消失,同时@JmsListener依然能正常接收消息。
内容的提问来源于stack exchange,提问作者Giovanni Lovato

