2016-12-27 21 views
0

Zookeeperからいくつかの設定を取得する必要があります。 私は今何:Zookeeperからの単純な設定の取得

ZooKeeper zk = null; 
try { 
    zk = new ZooKeeper(zkConnect, 1000, null); 
    byte[] fetched = zk.getData(CONFIG_ZNODE_PATH, false, null); 
    zk.close(); 
    return deserializeProps(fetched); 
} finally { 
    if (zk != null) { 
     zk.close(); 
    } 
} 

しかしdocでそれが述べられていますので、私は、私は正しい方法で、この単純なことをやっているかどうかわからない:

セッションの確立が非同期です。このコンストラクタは、サーバーへの接続を開始し、セッションが完全に確立される前に(通常は)潜在的に返されます。

コードが無効で、コンストラクタコールの後にgetDataを呼び出すことはできません。

ところで、コードを実行するとエラーは表示されません。

答えて

0

ここで起こるのは、zookeeperはバックグラウンドでzookeeperアンサンブルへの接続を確立します。したがって、設定をフェッチするためにメソッドを呼び出すときに、接続とセッションが正しく確立されています。

これは、動物園のクライアントが常に動物園のサーバーを見つけることができる完全なネットワークを持っている限り、正常に動作します。しかし、あなたのクライアントがしばらくの間、動物園のサーバーを見つけることができなくなった場合、これは私が推測する例外をスローし、あなたの操作は失敗します。もしどちらかが次のように飼育係のクライアントが接続されますまで待つ必要があり、そのアドレスに

private ZooKeeper zk; 
final CountDownLatch connectionLatch = new CountDownLatch(1); 

public void yourMethod() { 

    zk = new ZooKeeper(zkConnect, 2000, new Watcher() { 

     public void process(WatchedEvent we) { 
      if (we.getState() == KeeperState.SyncConnected) { 
       connectionLatch.countDown(); 
      } 
     } 
    }); 

    connectionLatch.await(); 

    // Now we have connected to zookeeper. 
    // Now, we can fetch configuration safely. 
    byte[] fetched = zk.getData(CONFIG_ZNODE_PATH, false, null); 
    return deserializeProps(fetched); 
} 

はあなたの方法は、間違ったそのわずか不安全ではないことに注意してください。あなたの場合、それはうまくいった。ネットワークの遅延が大きい場合は、期待どおりに動作しないことがあります。私が提案したのはより安全な方法でした。

私はthis blog postのコードを使用して私の提案を説明しました。あなたもそれを参照して、より良い理解を得ることができます。

+0

私は同様の実装を考えました。おそらく私のコードを更新するつもりです、ありがとう。 – Aliaxander

関連する問題