Spring Boot连接Solace JMS队列断连后无法自动重连问题求助
Solace JMS Spring Boot 自动重连配置方案
核心问题说明
原有手动实例化Connection、Session、MessageConsumer的实现方式,无法利用Solace客户端的重连能力和Spring JMS的自动恢复机制,断连后相关会话、消费者实例直接失效,也不会触发重建逻辑。
你配置的reconnectRetries=-1代表Solace客户端无限尝试重连,该场景下客户端不会将异常抛给自定义ExceptionListener,只有全部重连尝试失败后才会触发异常回调,所以你观察不到异常触发的现象。
完整调整方案
- 保留Solace连接工厂的重连参数,补充心跳配置,更早检测断连:
@Bean public SolConnectionFactory solConnectionFactory() throws Exception { SolConnectionFactory connectionFactory = SolJmsUtility.createConnectionFactory(); connectionFactory.setHost(environment.getProperty("solace.java.host")); connectionFactory.setVPN(environment.getProperty("solace.java.msgVpn")); connectionFactory.setUsername(environment.getProperty("solace.java.clientUsername")); connectionFactory.setPassword(environment.getProperty("solace.java.clientPassword")); connectionFactory.setClientID(environment.getProperty("solace.java.clientName")); // 原有重连配置 connectionFactory.setReconnectRetries(-1); connectionFactory.setReconnectRetryWaitInMillis(3000); connectionFactory.setConnectRetries(-1); connectionFactory.setConnectRetriesPerHost(5); // 新增心跳配置,10秒发送一次心跳检测连接状态 connectionFactory.setKeepAliveInterval(10000); return connectionFactory; }
- 新增Spring JMS监听容器配置,托管连接、会话、消费者的生命周期,自动处理断连恢复:
@Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(SolConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); factory.setSessionTransacted(false); // 开启自动启动 factory.setAutoStartup(true); // 断连后每3秒尝试恢复一次 factory.setRecoveryInterval(3000L); // 无限次尝试恢复 factory.setMaxRecoveryAttempts(-1); return factory; }
- 调整消息监听器的绑定方式,删除原有手动创建
Connection、Session、MessageConsumer的Bean代码:
在你的JmsMessageListener类的消息处理方法上添加@JmsListener注解绑定队列:
@Component public class JmsMessageListener { @JmsListener(destination = "${solace.message.consumer.queue}", containerFactory = "jmsListenerContainerFactory") public void onMessage(Message message) { // 原有消息处理逻辑 } }
- 开启Solace客户端日志,查看重连过程:
在application.yml或application.properties中添加日志配置:
logging.level.com.solacesystems=INFO
配置后可以在日志中看到Solace断连、重连尝试、重连成功的相关输出。
注意:不要手动管理JMS连接、会话、消费者的生命周期,全部交给Spring的监听容器托管,才能实现断连后的自动恢复
内容的提问来源于stack exchange,提问作者Coder Guru
相关产品推荐
相关产品推荐

