现状
之前公司的自管理监控项目可以实时监测Redis的运行状态,来检查Redis是否是正常运行的,但是最近经常出现一些问题,就是明明Redis集群是正常的,但是界面上却看不到Redis的运行状态,这就很奇怪了,于是看了下后台服务日志内容,报错内容大致如下
报错内容
2021-09-17 16:01:24.577 ERROR c.u.b.s.c.a.m.r.RedisStatusDetecter - redis detect error
redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the pool is exhausted
at redis.clients.jedis.util.Pool.getResource(Pool.java:53)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:288)
at com.ultrapower.bsms.selfmanage.collector.activedetect.middleware.redis.RedisCollector.doCollect(RedisCollector.java:35)
at com.ultrapower.bsms.selfmanage.collector.activedetect.middleware.redis.RedisStatusDetecter.detect(RedisStatusDetecter.java:35)
at com.ultrapower.bsms.selfmanage.collector.ScheduleTasks.redisDetecter(ScheduleTasks.java:182)
at sun.reflect.GeneratedMethodAccessor318.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
翻译成中文大致意思就是取不到Redis连接了,因为连接池已经耗尽了,那问题是正常情况下从JedisPool里面获取的redis连接应该会在使用完就会释放,现在给人的感觉就是连接池一直在取redis连接,但是使用完后并没有释放,最终导致连接池中的连接全部用完耗尽,当再也取不到连接的时候就会报上面这个错,而代码处理逻辑就是根据redis连接去获取Redis的活动状态,因为这里获取不到连接,就会认为Redis挂掉,进而就从数据库把redis的节点信息给删除了,所以界面上看不到redis了
根据这里报错的源头找到之前项目里这块代码有这么一段,可以看到这块通过jedisPool获取redis连接后进行了一波信息处理后就直接返回结果了,,,难道说jedisPool有自动释放redis连接的功能呢???还是说这是前人代码留下来的一个坑。。。。
Jedis jedis =null;
jedis = jedisPool.getResource();