2016-09-15 5 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"); 

세 센티넬, 그래서 jedis 클라이언트는 각 MasterListener 3 회를 initPool 것, 세 MasterListener.When 장애 조치가 발생 생성이있는 경우.

질문은 : 단지 initPool이 아닌 이유는 무엇입니까? sentinel 객관적인 오프라인 마스터, 다음 jedis 클라이언트가 다시 initPool 메시지를받을 때?

답변

0

"(if master!)는 (! 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) { 

}