ZooKeeper_5_JavaアクションZK_ノードの作成


ノードの作成
ノードを作成するには、次の2つのインタフェースがあります.
同期方式データノードの作成
String org.apache.zookeeper.ZooKeeper.create(String path, byte[] data, List acl, CreateMode createMode)
非同期でデータノードを作成
void org.apache.zookeeper.ZooKeeper.create(String path, byte[] data, List acl, CreateMode createMode, StringCallback cb, Object ctx)
注意:
a.非同期でも同期でもZooKeeperでは再帰的作成はサポートされておらず、親ノードが存在しない場合にサブノードを作成することはできません
b.ノードが既に存在する場合、同じ名前のノードを作成すると、NodeExistsException例外が放出されます.
c.ZooKeeperのノードコンテンツはバイト配列タイプ(byte[])のみをサポートし、つまりzookeeperはノードコンテンツのシーケンス化を担当しない.
同期を使用したノードの作成
コードを見てみましょう.
public class TestCreate implements Watcher {

	//  , 
	private static CountDownLatch downLatch = new CountDownLatch(1);

	public static void main(String[] args) throws Exception {

	ZooKeeper zookeeper = new ZooKeeper("10.0.227.66:2181", 5000, new TestCreate());

	System.out.println("zookeeper.getState()1 : " + zookeeper.getState());

	try {
			downLatch.await();//  , 
	} catch (Exception e) {
			e.printStackTrace();
	}

	System.out.println("zookeeper.getState()2 : " + zookeeper.getState());

	String result = zookeeper.create("/cyx", "666".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
	System.out.println("result : " + result);


	}

	@Override
	public void process(WatchedEvent event) {

	System.out.println("receive watched event : " + event);

	if (KeeperState.SyncConnected == event.getState()) {
			downLatch.countDown();//  -1
	}

	}

}
 
receive watched event : WatchedEvent state:SyncConnected type:None path:null
zookeeper.getState()2 : CONNECTED
result : /cyx

「/cyx」ノードを作成し、そのノードのデータを「666」に設定し、ノードタイプを一時ノードに設定します.
≪一時ノード|Temporary Node|emdw≫:クライアントがサービス側と接続を切断すると、作成された一時ノードは自動的に消えます.
「Ids.OPEN_ACL_UNSAFE」:権限の設定、オープンノードの設定、任意の操作を許可
「CreateMode.EPHEMERAL」:ノードタイプ、一時ノード
ここでは、権限の構成について説明します.
Ids.OPEN_ACL_UNSAFE
オープンノード、任意の操作を許可
Ids.READ_ACL_UNSAFE
読み取り専用ノード
Ids.CREATOR_ALL_ACL
作成者のすべての権限
一般的に私たちの内部システムは、権限に対する要求が高くないので、オープンノードを使用すればいいです.
ノードのタイプの設定
CreateMode.PERSISTENT
永続化ノード
CreateMode.PERSISTENT_SEQUENTIAL
永続化順序ノード
CreateMode.EPHEMERAL
一時ノード
CreateMode.EPHEMERAL_SEQUENTIAL
テンポラリシーケンスノード
非同期でノードを作成するには
コードを見てみましょう.
/**
*  
* 
* @author CYX
* @time 2017 8 4 1:31:12
*/
public class TestCreate2 implements Watcher {

	//  , 
	private static CountDownLatch downLatch = new CountDownLatch(1);

	public static void main(String[] args) throws Exception {

	ZooKeeper zookeeper = new ZooKeeper("10.0.227.66:2181", 5000, new TestCreate2());

	System.out.println("zookeeper.getState()1 : " + zookeeper.getState());

	try {
			downLatch.await();//  , 
	} catch (Exception e) {
			e.printStackTrace();
	}

	System.out.println("zookeeper.getState()2 : " + zookeeper.getState());

	zookeeper.create("/cyx", " ".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new MyStringCallback(), "I am context");

	zookeeper.create("/cyx", " ".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new MyStringCallback(), "I am context");

	zookeeper.create("/cyx", " ".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL, new MyStringCallback(), "I am context");

	Thread.sleep(Integer.MAX_VALUE);

	}

	@Override
	public void process(WatchedEvent event) {

	System.out.println("receive watched event : " + event);

	if (KeeperState.SyncConnected == event.getState()) {
			downLatch.countDown();//  -1
	}

	}

	static class MyStringCallback implements AsyncCallback.StringCallback {

	@Override
	public void processResult(int rc, String path, Object ctx, String name) {
			System.out.println("Create path result : [ " + rc + " , " + path + " , " + " , " + ctx + " , " + " ,real path name : " + name);
	}

	}

}
 :
zookeeper.getState()1 : CONNECTING
zookeeper.getState()2 : CONNECTED
Create path result : [ 0 , /cyx ,  , I am context ,  ,real path name : /cyx
Create path result : [ -110 , /cyx ,  , I am context ,  ,real path name : null
Create path result : [ 0 , /cyx ,  , I am context ,  ,real path name : /cyx0000000051

コードを見て、内部クラスを使用して、AsyncCallbackコールバックインタフェースを実現しました.
AsyncCallbackには7つの異なるコールバックインタフェースが含まれており、ここではしばらくは言わない.
processResult()コールバックメソッドパラメータの意味を理解します.
int rc
result codeサービス側応答コード.クライアントはこの符号化からAPI呼び出しの結果0を識別することができる:インタフェース呼び出し成功-4:クライアントとサービス側の接続が切断された-110:指定ノードが存在する-112:セッションが期限切れになった
String path
インタフェース呼び出し時にAPIに入力されるデータノードのノードパス
Object ctx
インタフェース呼び出し時にAPIに入力されるパラメータ値
String name
実際にサービス側で作成されたノード名
上記の説明と照らし合わせて、出力内容を見てみましょう.
最初の呼び出しに成功し、ノードの作成に成功しました
2回目はノードが同じ名前なので作成に失敗しました
3回目は、一時的な順序ノードを作成し、成功しました.