代碼按《ZooKeeper分布式過程協同技術詳解》中編寫:
需要先設置CLASSPATH ,可以在~/.bashrc 或者~/.bash_profile 中:添加:
export ZOOBINDIR=${ZOOKEEPER_HOME}/bin,ZOOKEEPER_HOME就是zookeeper的包位置
然后運行:. zkEnv.sh
echo $CLASSPATH 看看變化
package zkWatcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooDefs; import java.io.IOException; import java.util.Random; public class Master implements Watcher{ ZooKeeper zk; String hostPort; Master(String hostPort){ this.hostPort = hostPort; } void startZK() throws IOException { zk = new ZooKeeper(hostPort,15000,this); try { runForMaster(); } catch (KeeperException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } void closeZK() throws InterruptedException { zk.close(); } void runForMaster() throws KeeperException, InterruptedException { Random rand = new Random(); String serverId = Integer.toHexString(rand.nextInt()) ; zk.create("/master", serverId.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL ); } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Master m = new Master(args[0]); m.startZK(); System.out.println("load"); Thread.sleep(10000); //m.closeZK(); } @Override public void process(WatchedEvent event) { // TODO Auto-generated method stub System.out.println(event); } }
編譯的時候在zkWatcher 目錄下面:javac -cp $CLASSPATH Master.java
可以正常生成Master.class 文件
運行:javac -cp $CLASSPATH Master 127.0.0.1:2181
時會報:錯誤: 找不到或無法加載主類 Master
這個時候因為 Master.java帶了包名,回退到上一級目錄就可以通過了
java -cp $CLASSPATH zkWatcher/Master 127.0.0.1:2181
