Spring Boot 3中基于ActiveMQ Artemis自定义JMS ConnectionFactory遇连接异常
解决Spring Boot 3嵌入式ActiveMQ Artemis自定义连接工厂连接失败问题
问题根源
嵌入式ActiveMQ Artemis是在应用进程内启动的,并非独立外部服务。直接用vm://0或localhost地址创建自定义连接工厂时,要么因为嵌入式Broker还没完成启动,要么因为Spring Boot自动配置的嵌入式Broker未暴露对应网络/vm连接器,才会触发AMQ219007: Cannot connect to server(s). Tried with all available servers错误。
正确解决方案
方案1:复用嵌入式Broker实例创建连接工厂
直接注入Spring Boot自动配置的EmbeddedActiveMQBroker Bean,从其中获取Broker内部的ServerLocator构建自定义连接工厂,确保连接到当前进程内的嵌入式Broker:
@Configuration public class JMSConfig { @Bean(name = "queueConnectionFactory") public ConnectionFactory queueConnectionFactory(EmbeddedActiveMQBroker embeddedBroker) { ServerLocator serverLocator = embeddedBroker.getBroker().getServerLocator(); return new JmsConnectionFactory(serverLocator); } }
方案2:通过Artemis配置构建匹配的连接工厂
利用Spring Boot自动配置的ArtemisProperties,构建与嵌入式Broker配置一致的连接工厂,避免手动指定地址导致的不匹配:
@Configuration public class JMSConfig { @Bean(name = "queueConnectionFactory") public ConnectionFactory queueConnectionFactory(ArtemisProperties properties) { ArtemisConnectionFactoryFactory factory = new ArtemisConnectionFactoryFactory(properties, null); return factory.createConnectionFactory(JmsConnectionFactory.class); } }
临时包装方案的隐患
直接包装默认的CachedConnectionFactory虽然能临时获取多个工厂实例,但会绕开Spring Boot对嵌入式Broker的生命周期管理,可能引发连接缓存重复、资源泄漏等问题,且无法保证自定义工厂与嵌入式Broker的配置一致性。
内容的提问来源于stack exchange,提问作者Tukaram Bhosale
相关产品推荐
相关产品推荐

