주키퍼에서는 특정노드의 변화(생성,데이터수정,자식노드의 추가/제거, ACL변경) 을 알 수 있다.
폴링방식을 취할 경우, 지속적인 커넥션비용 혹은 반응시간에 문제가 있을 수 있다.
그래서 주키퍼에서는 메시지 이벤트 방식을 사용한다. 이것은 watcher 를 구현해서 쓸 수 있다.
왓쳐의 process 함수를 구현해주는데 아래의 event type 으로 상태를 구별할 수 있게 구현되어있다.
해당 process 라는 함수는 clientcnx 클래스의 쓰레드에서 호출 하게 된다.
커넥션 정보등을 노드에 저장하고 해당 장비가 장애로 인해 커넥션이 끊어지면 해당 노드가 빠짐으로써 해당 이벤트를 체크해 다른 장비쪽으로
request 를 할 수 있겠다.
public enum EventType {
None (-1),
NodeCreated (1),
NodeDeleted (2),
NodeDataChanged (3),
NodeChildrenChanged (4);
private final int intValue; // Integer representation of value
// for sending over wire
EventType(int intValue) {
this.intValue = intValue;
}
public int getIntValue() {
return intValue;
}
public static EventType fromInt(int intValue) {
switch(intValue) {
case -1: return EventType.None;
case 1: return EventType.NodeCreated;
case 2: return EventType.NodeDeleted;
case 3: return EventType.NodeDataChanged;
case 4: return EventType.NodeChildrenChanged;
default:
throw new RuntimeException("Invalid integer value for conversion to EventType");
}
}
}
}
abstract public void process(WatchedEvent event);
왓쳐의 구현
public class testWatcher implements Watcher {
public void process(WatchedEvent event) {
if( event.getType() == Event.EventType.NodeCreated
|| event.getType() == Event.EventType.NodeDeleted
|| event.getType() == Event.EventType.NodeDataChanged
|| event.getType() == Event.EventType.NodeChildrenChanged
)
{
try {
if( event.getType() == Event.EventType.NodeChildrenChanged ){
하위노드의 변경(노드생성, 삭제등등) 후 할 작업 코드~
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}