Spring Boot下ActiveMQ Artemis与Classic连接配置差异及适配问题
核心结论:两类配置不存在“二选一”的可比性,你之前的猜测有误
只引入spring-boot-starter-artemis依赖时,spring.activemq.*前缀的配置完全不会被自动装配识别,写了等于白写。
spring.activemq.*是spring-boot-starter-activemq专属的配置绑定前缀,仅用于连接经典版ActiveMQ 5.x实例,和Artemis生态完全无关spring.artemis.*是spring-boot-starter-artemis唯一默认支持的配置前缀,用于连接ActiveMQ Artemis(ActiveMQ的下一代版本,和5.x是完全独立的代码分支)实例
你写的第二类经典ActiveMQ风格配置,在只引入artemis starter的场景下不会触发任何ConnectionFactory的自动创建,启动时要么因为找不到ConnectionFactory的Bean报错,要么连不上你指定的broker地址。
配置选型建议
根本不存在两种配置选哪个更优的问题,按你引入的starter对应选配置前缀就行:
- 如果你用
spring-boot-starter-artemis,直接用spring.artemis.*配置即可,底层自动创建的是Artemis原生的org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory,走Artemis专属CORE协议连接,性能更好,也支持Artemis的HA、集群、自定义地址策略等高级特性 - 不要在artemis场景下硬套
spring.activemq.*配置,除非你打算完全放弃自动配置,手动写全所有JMS相关Bean的定义,纯属多余操作,没有任何收益
补充说明你写的spring.artemis.mode=native参数:这个配置是用来指定Artemis的连接模式,native代表直连远程部署的Artemis实例,另一个可选值embedded代表启动应用内嵌的Artemis broker,和经典ActiveMQ的配置逻辑没有任何关联。
Artemis自动配置场景下CachingConnectionFactory配置说明
绝大多数场景下不需要你额外手动配置CachingConnectionFactory:
- Spring Boot的Artemis自动配置默认就会把原生的Artemis ConnectionFactory包装为CachingConnectionFactory,默认开启会话、消息生产者的缓存,和经典ActiveMQ starter的默认缓存行为完全一致,直接注入JmsTemplate用就行,不用重复包装
- 如果你用DefaultMessageListenerContainer做消息消费,且配置了动态伸缩并发(即
maxConcurrentConsumers数值大于concurrentConsumers),建议把监听器容器的cacheLevel设置为CACHE_NONE,或者直接给监听器容器注入原生未包装的Artemis ConnectionFactory,避免动态调整消费线程数时出现会话泄漏、连接卡住的问题 - 如果你有特殊的缓存参数调整需求(比如自定义缓存会话数、开启消费者缓存),可以手动声明CachingConnectionFactory的Bean覆盖默认配置,常规业务场景完全不需要改默认实现。
内容的提问来源于stack exchange,提问作者fr3sh
相关产品推荐
相关产品推荐

