2016-09-15 91 views
0

jedis SRC代码MasterListener运行的方法:jedis MasterListener initPool多次

 j.subscribe(new JedisPubSub() { 
     @Override 
     public void onMessage(String channel, String message) { 
      log.fine("Sentinel " + host + ":" + port + " published: " + message + "."); 

      String[] switchMasterMsg = message.split(" "); 

      if (switchMasterMsg.length > 3) { 

      if (masterName.equals(switchMasterMsg[0])) { 
       initPool(toHostAndPort(Arrays.asList(switchMasterMsg[3], switchMasterMsg[4]))); 
      } else { 
       log.fine("Ignoring message on +switch-master for master name " 
        + switchMasterMsg[0] + ", our master name is " + masterName); 
      } 

      } else { 
      log.severe("Invalid message received on Sentinel " + host + ":" + port 
       + " on channel +switch-master: " + message); 
      } 
     } 
     }, "+switch-master"); 

如果有三个哨兵,所以创建了三个MasterListener.When故障发生,jedis客户端将initPool三次,每次MasterListener。

问题是:为什么不只是initPool一次?当哨兵客观地脱机主控,那么jedis客户端收到消息重新initPool?

回答

0

我觉得在这一行需要同步“if(!master.equals(currentHostMaster)){”来防止多次创建连接池。

public class JedisSentinelPool extends JedisPoolAbstract { 
    private volatile HostAndPort currentHostMaster; 
    private void initPool(HostAndPort master) { 
    if (!master.equals(currentHostMaster)) { 
     currentHostMaster = master; 
     if (factory == null) { 

}