博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Reids客户端Jedis的JedisSentinelPool关闭问题
阅读量:6229 次
发布时间:2019-06-21

本文共 1074 字,大约阅读时间需要 3 分钟。

  JedisSentinelPool使用一组MasterListener线程做主从复制的主服务器选举工作。其父类Pool的close, destory方法用来关闭正真的redis客户端连接池的对象。在JedisSentinelPool对象中重写了destory方法内容是在关闭选举线程之后,调用了父类destory方法;但是没有重写close方法,因而调用close方法不能关闭的掉MasterLinstener线程。Pool的另一个子类JedisPool则没有对close,destory方法做任何变动。

 

 JedisSentinelPool,JedisPool以及Pool之间的关系如下类图:

 

 查看Pool中close和destory的源码:

 

@Overridepublic void close() {  closeInternalPool();}
public void destroy() {  closeInternalPool();}

 close方法实现自java.io.Closeable接口,Closeable是可以关闭的数据源或目标。调用 close 方法可释放对象保存的资源(如打开文件)从这一点看是没有问题的,如果是JDK1.7+的话,那更好了该接口继承了AutoCloseable接口。对于JedisPool而言调用close方法和调用destory效果是一样的,但JedisSentinelPool就不同了,创建JedisSentinelPool是启动了MasterLinstener线程,所以得调用destory方法来完成JedisSentinelPool所持有的资源释放,线程关闭。

 JedisSentinelPool的destory方法:

public void destroy() {  for (MasterListener m : masterListeners) {    m.shutdown();  }  super.destroy();}

  

 结论:如果要关闭的仅仅是Pool(Reids客户端连接池)则调用close,而要关闭主从复制中的主机检测即彻底关闭JedisSentinelPool则要调用destory方法。 

 意外想当然的调用close方法,并没能关闭MasterLinstener线程,并且MasterLinstener线程没有起个好名字,排查是看到的名字叫Thread-xx (xx是数字),这样很不方便排错。!!!所以启动线程起个好名字真的非常必要,这将对排错,诊断,系统监控有莫大的帮助。

转载地址:http://iutna.baihongyu.com/

你可能感兴趣的文章
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
JDBC的事务
查看>>
Io流的概述
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
作业:实现简单的shell sed替换功能和修改haproxy配置文件
查看>>
Altium 拼板方法以及 注意的 地方
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
oracle12C 重做日志
查看>>
zookeeper与kafka安装部署及java环境搭建(发布订阅模式)
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
ObjectOutputStream和ObjectInputStream
查看>>