2012-04-05 8 views
2

Ich benutze Zookeeper v3.3.3 + dfsg2-1ubuntu1, läuft auf Ubuntu vm. (Die virtuelle Maschine läuft mit einer NAT-Netzwerkverbindung)Konnte keine Verbindung zu ZooKeeper von C# Anwendung mit Apache .NET-Bibliothek

Auf meiner Entwicklung Maschine (Windows 7), wenn ich laufe: zkCli.cmd -server 10.10.135.19:2181 es schließt fein und ich kann create s durchführen, get s usw.

ich habe C# 4-Anwendung mit einer NuGet-Abhängigkeit von Org.Apache.ZooKeeper v1.0.0.0.

ich es in der folgenden Art und Weise bin mit:

class watcher : IWatcher 
    { 
    private readonly ManualResetEventSlim _connected = new ManualResetEventSlim(false); 
    private WatchedEvent _event; 

    public void WaitUntilConnected() 
    { 
     _connected.Wait(); 

     if (_event == null) throw new ApplicationException("bad state"); 
     if (_event.State != KeeperState.SyncConnected) 
      throw new ApplicationException("cannot connect"); 
    } 

    public void Process(WatchedEvent @event) 
    { 
     _event = @event; 
     _connected.Set(); 
    } 
    } 

    ... 

    public void TestZooKeeper() 
    { 
    _countdownWatcher = new watcher(); 
    _zk = new ZooKeeper(
     Settings.Default.ZookeeperConnectionString, // 10.10.135.19:2181 
     new TimeSpan(Settings.Default.ZookeeperConnectionTimeout), // 10000 
     _countdownWatcher); 
    _countdownWatcher.WaitUntilConnected(); 
    } 

Das Problem ist, dass dies hängt nur. Auf den zookeeper Protokolle, sehe ich folgendes:

2012-04-05 08:12:21,376 - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:[email protected]] - Accepted socket   connection from /10.0.2.2:51057 
2012-04-05 08:12:21,379 - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:[email protected]] - Client attempting to establish new session at /10.0.2.2:51057 
2012-04-05 08:12:21,383 - INFO [SyncThread:0:[email protected]] - Established session 0x1367c91bf580047 with negotiated timeout 4000 for client /10.0.2.2:51057 
2012-04-05 08:12:22,500 - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:[email protected]] - Accepted socket connection from /10.0.2.2:51059 
2012-04-05 08:12:22,502 - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:[email protected]] - Client attempting to establish new session at /10.0.2.2:51059 
2012-04-05 08:12:22,505 - INFO [SyncThread:0:[email protected]] - Established session 0x1367c91bf580048 with negotiated timeout 4000 for client /10.0.2.2:51059 
2012-04-05 08:12:26,000 - INFO [SessionTracker:[email protected]] - Expiring session 0x1367c91bf580047, timeout of 4000ms exceeded 
2012-04-05 08:12:26,001 - INFO [ProcessThread:-1:[email protected]] - Processed session termination for sessionid: 0x1367c91bf580047 
2012-04-05 08:12:26,004 - INFO [SyncThread:0:[email protected]] - Closed socket connection for client /10.0.2.2:51057 which had sessionid 0x1367c91bf580047 
2012-04-05 08:12:28,001 - INFO [SessionTracker:[email protected]] - Expiring session 0x1367c91bf580048, timeout of 4000ms exceeded 
2012-04-05 08:12:28,002 - INFO [ProcessThread:-1:[email protected]] - Processed session termination for sessionid: 0x1367c91bf580048 
2012-04-05 08:12:28,004 - INFO [SyncThread:0:[email protected]] - Closed socket connection for client /10.0.2.2:51059 which had sessionid 0x1367c91bf580048 

Und dies wird fortgesetzt, bis ich den Prozess manuell, dh die WaitUntilConnected() Methode töten nie zurückgibt. (verifiziert mit Debugging)

Es sieht so aus, als ob die Clientverbindung den Server erreicht, aber der Watcher merkt das nie, nichts passiert weiter auf diesem Kanal und der Server tötet die Verbindung, nur um den Client erneut zu versuchen. Irgendwelche Ideen, was ich hier falsch mache?

+0

ist Watcher.Process jemals aufgerufen? – miniBill

+0

nein. Ich bin ein wenig durch den Quellcode gegangen. Intern erreicht der Verbindungsstatus niemals den Status CONNECTING, da er beim ersten Lesen der ersten Antwort auf dem Socket vom ZK-Server nichts findet. –

+0

Sie könnten versuchen, ein Tool wie wireshark zu verwenden, um zu sehen, was sich zwischen den Verbindungen des Clients und Ihres Codes unterscheidet. – miniBill

Antwort

5

Es stellt sich heraus, dass die kanonische Version der C# -Client-Bibliothek für ZooKeeper unter https://github.com/ExactTargetDev/zookeeper/tree/et-develop liegt, was sich von dem unterscheidet, auf das das ZooKeeper-Wiki zeigt.

  • Erstellen Sie die Quelle, indem Sie es von Github erhalten. Stellen Sie sicher, dass Sie den Zweig et-develop erhalten.
  • ant auf der obersten Ebene ausgeführt wird (Dies ruft jute, die in der C# Projekt verwendet RPC-Klassen generiert)
  • Öffnen Sie den src/dotnet Ordner und die Lösung dort und
  • bauen es

I Ich habe die Unit-Tests durchgeführt, die mit meinem lokalen ZooKeeper verbunden waren, und sie liefen gut.

+1

https://github.com/ExactTargetDev/zookeeper/network – Henrik

Verwandte Themen