Zookeeperによる分散システム管理(2)

前回はZookeeperがどのようなものかを簡単にまとめてみました。
今回はその続きということで、実際にJavaのプログラムから触ってみることにします。

ichiwork.hatenablog.com

確認環境の準備

動作確認のための環境準備なので、Dockerを利用してスタンドアロン構成にて環境を準備します。

docker run -d -p 2181:2181 zookeeper

Javaクライアントにて接続してみる

Zookeeperの依存性を追加する

Zookeeperの依存性を追加します。
Mavenを利用している場合、pomファイルに以下の記述を追加します。

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>

サンプルソース

一般的に利用されるであろう非同期処理パターン
public class Sample01 {
	public static void main(String[] args) throws Exception {
		ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 3000, null);

		// 非同期でexists呼び出しを行う
		zk.exists("/foo", myWatcher, existsCallBack, null);
		// 確認のためコールバックされる前にスレッドが終了しないようにスリープしておく
		Thread.sleep(3000);
	}

	// Watcherの実装
	static Watcher myWatcher = new Watcher() {
		@Override
		public void process(WatchedEvent event) {
			// WatcherEventを処理
			System.out.println("myWatcher:" + event.toString());
		}
	};

	// コールバックメソッドの実装
	static StatCallback existsCallBack = new StatCallback() {
		@Override
		public void processResult(int rc, String path, Object ctx, Stat stat) {
			System.out.println("existsCallBack:" + path);
		}
	};
}

複数の操作を1つのブロックにまとめてアトミックに実行できるMultitop

public class Sample02 extends Transaction implements Watcher {
	protected Sample02(ZooKeeper zk) {
		super(zk);
	}

	public static void main(String[] args) throws Exception {
		ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 3000, null);
		Sample02 sample = new Sample02(zk);

		// Multiopの利用
		sample.delete("/foo", -1);
		sample.delete("/bar", -1);
		sample.commit();
	}

	@Override
	public void process(WatchedEvent event) {
		System.out.println(event.toString());
	}
}

Zookeeper本の追加資料のurl
github.com