zookeeper 분포식 재해 수용 코드 예시

잔말 말고 코드로 해!

import java.net.InetAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class ClusterTest {
	
	static ZooKeeper zk = null;
	static Map<String, Watcher> myWatchMap = new HashMap<String, Watcher>();
	static String ip = null;

	public static void init() throws InterruptedException {
		for(int i = 1; i < 6; i++){
			final int k = i;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					//            
					try {
						ZooKeeper zk = new ZooKeeper(
								"localhost:2181,localhost:2182", 1000, null);
						String path = ip+k;
						if(zk.exists(path, false) == null){
							zk.create(path, "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,
									 CreateMode.EPHEMERAL);
						}						
						Thread.sleep(1000);
						zk.close();
					} catch (Exception e) {
//						e.printStackTrace();
					}	
				}
			});
			t.start();
			t.setName("RISHENG-THREAD-"+i);
		}
	}

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		InetAddress addr = InetAddress.getLocalHost();
		ip="/zookeeper/"+addr.getHostAddress();
		//            
		zk = new ZooKeeper("localhost:2181,localhost:2182",
						1000, null);	
		List<String> nodeList = zk.getChildren("/zookeeper", false);
		System.err.println(nodeList);
		init();	
		regWatch();
		while(true){			
			Thread.sleep(1000);
			init();
			regWatch();
		}		
	}
	
	public static void regWatch() throws KeeperException, InterruptedException{
		for(int i = 1; i < 6; i++){
			String path = ip+i;
			Watcher watch = null;
			if(!myWatchMap.containsKey(path)){
				watch = new MyWatch(zk, path);
				myWatchMap.put(path, watch);
			}
			zk.exists(path, watch);
		}
	}
}

class MyWatch implements Watcher{
	private ZooKeeper zk = null;
	private String path = null;
	public MyWatch(ZooKeeper zk, String path){
		this.zk = zk;
		this.path = path;
	}

	@Override
	public void process(WatchedEvent event) {	
		if(EventType.NodeDeleted.equals(event.getType())){
			System.err.println(event.getPath()+"====    ===="+path);
		} else if(EventType.NodeCreated.equals(event.getType())){
			System.out.println(event.getPath()+"====    ===="+path);
		}
		try {  
            zk.exists(event.getPath(), this);  
        } catch (KeeperException e) {  
        } catch (InterruptedException e) {  
        }  
	}
	
}


주목해야 할 사항은 다음과 같습니다.
1. 중복된 new 새 Watcher는 구독자가 알림을 중복적으로 받을 수 있습니다.
2. zk의 Watcher는 일회성 소비이기 때문에 사용한 후에 다시 등록하는 것을 기억해야 한다.
3. zk는 통지 관계의 시종 이력서를 보장하지 않기 때문에 Watcher를 조회하여 등록해야 한다.

좋은 웹페이지 즐겨찾기