2017-04-12 9 views
1

여러 Tomcat 인스턴스에 Spring Integration 4.3.8 앱이 배포되어 있고 앱은 org.springframework.integration:spring-integration-zookeeper:4.3.8.RELEASE을 사용하여 한 번에 하나씩 만 선출 된 클러스터에서 앱의 여러 인스턴스를 실행합니다. 리더.Spring Integration Zookeeper - 현재 내가 선두 주자

질문 : 내가 리더인지 아닌지를 앱에서 쿼리하는 가장 간단한 방법은 무엇입니까? 사용 가능한 큐레이터/사육사 API를 통해이 정보를 얻을 수 있습니까? 또는 어떤 종류의 이벤트 리스너를 만들어야합니까?

답변

1

LeaderInitiator을 사용하시기 바랍니다.

리더 역할이 부여되면 OnGrantedEvent이 방출됩니다. 심지어 Context 속성이 있습니다. 그 중 하나는 차례로 isLeader() 상태입니다.

나중에 필요할 때 사용할 수 있도록이 개체를 저장할 수 있으며 필요하면 언제든지 isLeader()을 확인하십시오.

버전 5.0LeaderInitiator 컨텍스트에 직접 액세스 제공하기 때문에 : 또한 부를 수

/** 
* The context of the initiator or null if not running. 
* @return the context (or null if not running) 
* @since 5.0 
*/ 
public Context getContext() { 
    if (this.leaderSelector == null) { 
     return NULL_CONTEXT; 
    } 
    return this.context; 
} 
+0

'isRunning는()'끝점 중 하나를; 당신이 지도자라면 그것은 사실 일 것입니다. –

+0

@GaryRussell, 우리 엔드 포인트는 배포가 리더가 되더라도 일부 엔드 포인트를 시작하지 못하게하려는 비즈니스 사례가 있으므로 무시되었습니다. 사실 이것은 우리가 리더인지 여부를 알 수있는 방법을 찾고있는 이유이며, 따라서 hasLeadership = true 일 때만 오버라이드 된 끝점에서 super.start()를 호출 할 수 있습니다. 그러므로 왜이 경우 엔트 포인트에서'isRunning()'을 쿼리하는 것이 우리를 위해 작동하지 않습니다. –

+0

OK, @PonderMuse! 내 답변이 귀하의 유스 케이스에 적합한 지 궁금합니다. –