IntelliJ中Spring Boot启用热重载后ActiveMQ连接刷新错误求助
解决Spring Boot DevTools热重载导致ActiveMQ连接异常的问题
我之前在整合DevTools和ActiveMQ时碰到过一模一样的问题,核心原因是DevTools重启应用上下文时,旧的ActiveMQ连接、监听器没被正确销毁,新上下文尝试建立连接时出现资源冲突,或者旧监听器持续占用资源引发异常。
下面是几个亲测有效的解决办法:
方法一:排除JMS相关Bean的重启
DevTools默认会重启整个上下文,可通过配置让它忽略特定JMS相关Bean,避免监听器重复初始化:
在src/main/resources/META-INF/spring-devtools.properties中添加:
spring.devtools.restart.exclude=org.springframework.jms.** spring.devtools.restart.exclude=com.yourpackage.jms.** # 替换成你项目里的JMS类包路径
方法二:调整DefaultMessageListenerContainer的连接恢复策略
修改JMS监听器配置,优化连接重试参数,同时确保上下文关闭时能正确停止容器:
@Bean public DefaultMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) { DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setDestinationName("Consumer.test.VirtualTopic.activemq.ENTITY.T"); // 设置更合理的重试规则,避免无限重试 container.setBackOff(new FixedBackOff(1000, 5)); // 间隔1秒重试,最多5次 // 确保上下文关闭时自动停止容器 container.setAutoStartup(true); container.setPhase(Integer.MAX_VALUE); // 保证在上下文关闭时最后停止 return container; }
方法三:强制DevTools重启时销毁ActiveMQ连接
在配置类中添加销毁回调,确保重启时主动关闭ActiveMQ连接:
@Configuration public class ActiveMQConfig { @Autowired private ConnectionFactory connectionFactory; @PreDestroy public void closeConnection() throws JMSException { if (connectionFactory instanceof ActiveMQConnectionFactory) { ((ActiveMQConnectionFactory) connectionFactory).clearAllConnections(); } } }
方法四:检查ActiveMQ连接池配置
如果用了连接池,确保配置了合理的连接数和回收策略,避免重启时连接耗尽:
spring.activemq.pool.max-connections=10 spring.activemq.pool.idle-timeout=30000 spring.activemq.pool.expiry-timeout=0
另外别忘了检查IntelliJ的设置:开启Build project automatically(路径:File > Settings > Build, Execution, Deployment > Compiler),并在Registry中开启compiler.automake.allow.when.app.running(按Ctrl+Shift+A搜索Registry)。
内容的提问来源于stack exchange,提问作者Mançaux Pierre-Alexandre
相关产品推荐
相关产品推荐

