2014-02-10 3 views
8

나는 노드에서 시계를 유지할 필요가있는 프로젝트에서 일하고 있는데 그 노드도 아이들이다. PathCache를 사용해 보았지만 여기서 아이들 아이들을 지켜 볼 방법이 확실하지 않습니다.큐레이터를 사용하여 ZooKeeper의 자손 노드에서 이벤트를 보는 방법?

여기 내 루트 노드는 - "/my/test"이고 아래 코드를 사용하여 해당 노드에서 감시하고 있습니다. 내가하고 싶은 건 "/my/test" znode에 시계를 두는 것입니다. 그래서 이러한 노드 내 루트 노드에 추가됩니다 경우 가정 - (나는 그것이 작동되도록 할 수 있어요이 부분까지) 그리고 내가 알림을 받게한다

"/my/test/test1" 
"/my/test/test2" 
"/my/test/test3" 

하지만 새로운 노드가 추가됩니다 경우, "/my/test/test1" 업데이트 또는 삭제, "/my/test/test2""/my/test/test3" 나는 또한 알림을 받아야하며 이것이 작동하도록하는 방법을 이해할 수없는 부분입니다.

나는 시계가 아래의 코드를 사용하여 트리거됩니다 "/my/test" 그런 다음 "/my/test/test2", "/my/test/test3", "/my/test/test1"로 새로운 노드를 추가하고 때마다

. 그러나 "/my/test/test1" 또는 "/my/test/test2"에 새 노드를 추가하는 경우 아무 시계도 트리거되지 않으며 코드를 추가하는 방법도 잘 모르겠습니다. 어떤 생각을 어떻게 할 수 있습니까? 누군가가 ... 과거에 이런 짓을했다 그래서 어떤 예를 나에게 큰 도움이 될 것입니다 경우

다음은

"/my/test" 아이들하지만 "/my/test/test1" 등의 아니라 어린이를위한 잘 작동 내 코드입니다 .. 수 있음

private static void addListener(PathChildrenCache cache) { 

    PathChildrenCacheListener listener = new PathChildrenCacheListener() { 
     public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { 
      switch (event.getType()) { 
      case CHILD_ADDED: { 
       System.out.println("Node added: " + ZKPaths.getNodeFromPath(event.getData().getPath())); 
       break; 
      } 

      case CHILD_UPDATED: { 
       System.out.println("Node changed: " + ZKPaths.getNodeFromPath(event.getData().getPath())); 
       break; 
      } 

      case CHILD_REMOVED: { 
       System.out.println("Node removed: " + ZKPaths.getNodeFromPath(event.getData().getPath())); 
       break; 
      } 
      default: 
       break; 
      } 
     } 
    }; 
    cache.getListenable().addListener(listener); 
} 

사람이 내 사용 사례에 대해 이것에 대한 간단한 예제를 제공 할 수 - 등

다음
private static final String PATH = "/my/test"; 

public static void main(String[] args) { 
    CuratorFramework client = null; 
    PathChildrenCache cache = null; 
    try { 
     client = CuratorClient.createSimple("localhost:2181"); 
     client.start(); 

     // in this example we will cache data. Notice that this is optional. 
     cache = new PathChildrenCache(client, PATH, true); 
     cache.start(); 

     addListener(cache); 

     for(;;) { 
      try { 
       Thread.sleep(50000); 
      } catch(InterruptedException e) { 
      } 
     } 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
    } 
} 

내의 addListener 방법이다? 최근 큐레이터 2.4.0을 사용하고 있습니다.

+0

당신은''/ my/test ''에 추가 된 모든 아이들을 지키고 있어야한다고 생각합니다. – weima

답변

2

이 문제의 해결책을 찾으셨습니까?

한 해킹 내가 좋아하는 아이들을 사용하는 것이 좋습니다 수 있습니다

  • /내/테스트/test1_node1
  • /내/테스트/test1_node2

그래서 TEST1의 자식 노드로를 추가 test1 자체의 이름.

4

대신에 TreeCache를 사용하십시오. PathCache가 자식 노드를 처리 할 수있는 모든 작업을 수행합니다.