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

WildFly部署Spring应用启动时Artemis Topic日志泛滥原因排查

问题分析与解决方案

这个重复日志的问题,本质是Spring Boot的Artemis自动配置逻辑和WildFly内置的ActiveMQ Artemis实例之间的交互冲突,具体有两种常见触发场景:

  1. 动态目的地的重复创建请求:
    当你使用@JmsListener时,Spring默认会检查目标目的地(也就是my-topic)是否存在。如果不存在,Spring会自动发送动态创建请求给Artemis服务器。WildFly的Artemis每次收到这个创建请求,就会打印AMQ221052: Deploying topic jms.topic.my-topic的日志。而Spring在启动阶段的监听器容器初始化过程中,可能会多次触发这个检查/创建逻辑,导致日志重复刷屏。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:25