2014-02-10 6 views
8

Ich arbeite an einem Projekt, in dem ich Uhren auf einem Knoten pflegen muss, und das Knoten auch Kinder. Ich habe versucht, PathCache zu verwenden, aber ich bin mir nicht sicher, wie man hier auf Kinderkinder aufpasst?Wie kann man Ereignisse in den Nachkommenknoten in ZooKeeper mithilfe des Kurators beobachten?

Hier ist mein Wurzelknoten - "/my/test" und ich beobachte diesen Knoten mit dem untenstehenden Code. Was ich machen möchte ist, die Uhr auf "/my/test" znode zu halten. So nehme an, wenn diese Knoten zu meinem Stammknoten hinzugefügt wird -

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

Dann sollte ich (bis auf diesen Teil ich in der Lage bin, damit es funktioniert) benachrichtigt, aber wenn jeder neue Knoten hinzugefügt wird, aktualisiert oder entfernt "/my/test/test1", "/my/test/test2" und "/my/test/test3" dann sollte ich auch benachrichtigt werden und das ist der Teil, den ich nicht verstehen kann, wie es funktioniert.

Jedes Mal, wenn ich einen neuen Knoten "/my/test/test3" dann die Uhr mit der Verwendung von Code unten wird ausgelöst "/my/test" wie "/my/test/test1", "/my/test/test2", mich hinzufügen. Aber wenn ich einen neuen Knoten zu "/my/test/test1" oder "/my/test/test2" hinzufügen, dann werden keine Uhren ausgelöst und ich bin nicht sicher, wie man den Code dafür auch? Irgendwelche Gedanken wie das gemacht werden kann?

Kann sein, wenn jemand dies in der Vergangenheit getan hat .. also kein Beispiel wird mir eine große Hilfe sein ..

Unten ist mein Code, die für "/my/test" Kinder gut funktioniert, aber nicht die Kinder von "/my/test/test1" und etc

usw.
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(); 
    } 
} 

Unten ist meine addListener Methode -

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); 
} 

Kann jemand ein einfaches Beispiel für den für meinen Anwendungsfall zur Verfügung stellen? Ich benutze Curator 2.4.0, der kürzlich veröffentlicht wurde.

+0

ich denke, dass Sie für jedes Kind wachhalten müssen, das zu ""/my/test "" hinzugefügt wird – weima

Antwort

2

Haben Sie eine Lösung für dieses Problem gefunden?

Ein Hack kann ich vorschlagen, um die Kinder zu verwenden wie:

  • /my/test/test1_node1
  • /my/test/test1_node2

So das Kind Knoten von test1 Anhängen in der Name von test1 selbst.

4

Verwenden Sie stattdessen den TreeCache. Es tut alles, was der PathCache tut und kann auch Kind-Knoten behandeln.

Verwandte Themen