Java ThreadLocal 导致的连接泄漏
问题描述
某系统接连出现连接泄漏问题。表现为:
- 使用
RabbitMQ
作为消息队列,使用RabbitMQ
的Connection
进行消息发送。 - 封装了
RabbitMQ
客户端,使用ThreadLocal
保存Connection
。
连接数持续增长,直到连接达到 RabbitMQ
的最大连接数,导致系统无法正常工作。
分析
此问题出现周期间隔较长,且每次出现时,系统日志中均无异常信息,无法通过日志分析问题。只有最终的连接泄漏报错处,打出了少量的日志信息。
一开始出现时,怀疑是网络问题,导致无法连接。但排查后,发现网络一切正常。
直至后来某次,日志明确报出:The channelMax limit is reached
,才意识到是连接泄漏问题。
检索代码,发现 ThreadLocal
的使用方式如下: