SpringBoot应用Solace JMS连接失败3次后无法自动恢复问题求助
问题根因分析
- Solace JMS客户端默认重连次数为3次,日志中
attempt 3 of 3说明默认重试次数耗尽后,客户端直接终止了重连任务,对应日志输出Stale reconnect task, aborting reconnect。 - 飞行模式场景下,全网络断开会清空本地Kerberos临时票据缓存,恢复网络后原有登录上下文已经失效,重连时用失效票据认证必然失败;而仅断开VPN不会清除Kerberos缓存,因此重连可以正常恢复。
- 之前新增的
spring.jta.bitronix.connectionfactory.ignore-recovery-failures=true是Bitronix事务恢复阶段的配置,仅作用于事务恢复的失败忽略逻辑,和Solace客户端本身的重连逻辑完全无关,因此不生效。
解决方案
1. 调整Solace客户端重连与认证配置
在现有Solace连接配置的driverProperties下新增如下参数:
# 重连最大次数,-1代表无限重试,可根据业务需要调整为指定数值 spring.jta.bitronix.connectionfactory.driverProperties.reconnectRetries=-1 # 两次重连之间的间隔时间,单位毫秒,可自行调整 spring.jta.bitronix.connectionfactory.driverProperties.reconnectRetryWaitInMillis=3000 # 开启认证上下文自动刷新,解决Kerberos票据失效后无法重连的问题 spring.jta.bitronix.connectionfactory.driverProperties.authenticationRefreshTimeoutInMillis=3600000
2. 配置JmsTemplate连接校验
避免注入的JmsTemplate持有失效连接直接使用,新增如下Spring JMS配置:
# 发送消息前校验连接有效性,失效则自动重建 spring.jms.template.session-transacted=true # 不需要连接缓存可以直接关闭缓存,避免拿到失效连接 spring.jms.cache.enabled=false # 如果要保留连接缓存,新增以下校验配置 spring.jms.cache.connection-checkout-timeout=5000
3. 可选:新增Kerberos票据定时刷新
如果Kerberos票据本身存在有效期限制,可在应用内新增定时任务,定期刷新本地Kerberos票据缓存,避免长时间运行后票据失效导致的连接问题。
4. 功能验证
可通过原复现路径验证:切换笔记本到飞行模式等待1分钟以上,再恢复网络,等待配置的重连间隔后发送测试消息,确认消息可正常推送、无需手动重启应用即可恢复服务。
内容的提问来源于stack exchange,提问作者codeLover
相关产品推荐
相关产品推荐

