15.7.2 应用程序实例
此节将通过一组简单的ZooKeeper应用程序实例来向大家展示ZooKeeper的某些功能。这一节所实现的主要功能包括:创建组、加入组、列出组成员,以及删除组。
为了避免某些重复性的操作,我们创建了一个本应用程序的基类:ZooKeeperInstance。它主要实现了Zookeeper对象的实例化操作。详见代码清单15-9。
代码清单15-9 ZooKeeperInstance
1 package cn.edu.ruc.cloudcomputing.book.chapter15;
2
3 import java.io.IOException;
4
5 import org.apache.zookeeper.WatchedEvent;
6 import org.apache.zookeeper.Watcher;
7 import org.apache.zookeeper.ZooKeeper;
8
9 public class ZooKeeperInstance{
10//会话超时时间,设置为与系统默认时间一致
11 public static final int SESSION_TIMEOUT=30000;
12
13//创建ZooKeeper实例
14 ZooKeeper zk;
15
16//创建Watcher实例
17 Watcher wh=new Watcher(){
18 public void process(WatchedEvent event){
19 System.out.println(event.toString());
20}
21};
22
23//初始化Zookeeper实例
24 public void createZKInstance()throws IOException{
25 zk=new ZooKeeper("localhost:2181",ZooKeeperInstance.SESSION_
TIMEOUT, this.wh);
26}
27
28//关闭ZK实例
29 public void ZKclose()throws InterruptedException{
30 zk.close();
31}
32}
在ZooKeeper中的组机制也同样是通过ZooKeeper节点来实现的。一个Znode为一个目录,即代表着一个组。这里我们创建了一个名为“/ZKGroup”的组。详见代码清单15-10。
代码清单15-10 CreateGroup
1 package cn.edu.ruc.cloudcomputing.book.chapter15;
2
3 import java.io.IOException;
4
5 import org.apache.zookeeper.CreateMode;
6 import org.apache.zookeeper.KeeperException;
7 import org.apache.zookeeper.ZooDefs.Ids;
8
9 public class CreateGroup extends ZooKeeperInstance{
10
11//创建组
12//参数:groupPath
13 public void createPNode(String groupPath)throws KeeperException,
InterruptedException{
14//创建组
15 String cGroupPath=zk.create(groupPath,"group".getBytes(),Ids.OPEN_
ACL_UNSAFE, CreateMode.PERSISTENT);
16//输出组路径
17 System.out.println("创建的组路径为:"+cGroupPath);
18}
19
20 public static void main(String[]args)throws IOException, KeeperException,
InterruptedException{
21 CreateGroup cg=new CreateGroup();
22 cg.createZKInstance();
23 cg.createPNode("/ZKGroup");
24 cg.ZKclose();
25}
26}
在创建组操作完成之后,我们需要将成员加入到组当中,也就是将节点加入到组节点的目录下,成为其子节点。在创建节点之前,首先需要调用exists()函数来判断组目录是否存在。此程序中创建了一个MultiJoin()函数,它通过一个计数器为组节点创建10个子节点。详见代码清单15-11。
代码清单15-11 JoinGroup
1 package cn.edu.ruc.cloudcomputing.book.chapter15;
2
3 import java.io.IOException;
4
5 import org.apache.zookeeper.CreateMode;
6 import org.apache.zookeeper.KeeperException;
7 import org.apache.zookeeper.ZooDefs.Ids;
8
9 public class JoinGroup extends ZooKeeperInstance{
10//加入组操作
11 public int Join(String groupPath, int k)throws KeeperException,
InterruptedException{
12 String child=k+"";
13 child="child_"+child;
14
15//创建的路径
16 String path=groupPath+"/"+child;
17//检查组是否存在
18 if(zk.exists(groupPath, true)!=null){
19//如果存在,加入组
20 zk.create(path, child.getBytes(),Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
21 return 1;
22}
23 else{
24 System.out.println("组不存在!");
25 return 0;
26}
27}
28
29//加入组操作
30 public void MultiJoin()throws KeeperException, InterruptedException{
31 for(int i=0;i<10;i++){
32 int k=Join("/ZKGroup",i);
33//如果组不存在则退出
34 if(0==k)
35 System.exit(1);
36}
37}
38 public static void main(String[]args)throws IOException, KeeperException,
InterruptedException{
39 JoinGroup jg=new JoinGroup();
40 jg.createZKInstance();
41 jg.MultiJoin();
42 jg.ZKclose();
43}
44}
在加入组操作完成之后,我们通过getChildren()函数来列出所有组的成员(即获取组目录下的所有孩子节点)。详见代码清单15-12:
代码清单15-12 ListMembers
1 package cn.edu.ruc.cloudcomputing.book.chapter15;
2
3 import java.io.IOException;
4 import java.util.List;
5
6 import org.apache.zookeeper.KeeperException;
7
8 public class ListMembers extends ZooKeeperInstance{
9 public void list(String groupPath)throws KeeperException, InterruptedException{
10//获取所有子节点
11 List<String>children=zk.getChildren(groupPath, false);
12 if(children.isEmpty()){
13 System.out.println("组"+groupPath+"中没有组成员存在!");
14 System.exit(1);
15}
16 for(String child:children)
17 System.out.println(child);
18}
19
20 public static void main(String[]args)throws IOException, KeeperException,
InterruptedException{
21 ListMembers lm=new ListMembers();
22 lm.createZKInstance();
23 lm.list("/ZKGroup");
24}
25}
在执行删除组操作时,我们首先需要删除组目录下的所有成员,当组目录空时,再将组目录删除。那么,这过程中首先就需要调用getChildren()函数,获取组目录的所有成员,然后调用delete()函数将其一一删除。最后删除组目录。详见代码清单15-13。
代码清单15-13 DelGroup
1 package cn.edu.ruc.cloudcomputing.book.chapter15;
2
3 import java.io.IOException;
4 import java.util.List;
5
6 import org.apache.zookeeper.KeeperException;
7
8 public class DelGroup extends ZooKeeperInstance{
9 p u b l i c v o i d d e l e t e(S t r i n g g r o u p P a t h)t h r o w s K e e p e r E x c e p t i o n,
InterruptedException{
10 List<String>children=zk.getChildren(groupPath, false);
11//如果不空,则进行删除操作
12 if(!children.isEmpty()){
13//删除所有子节点
14 for(String child:children)
15 zk.delete(groupPath+"/"+child,-1);
16}
17//删除组目录节点
18 zk.delete(groupPath,-1);
19}
20
21 public static void main(String args[])throws IOException, KeeperException,
InterruptedException{
22 DelGroup dg=new DelGroup();
23 dg.createZKInstance();
24 dg.delete("/ZKGroup");
25 dg.ZKclose();
26}
27}
限于篇幅,本章只介绍了关于Zookeeper的一些基本知识,希望大家通过本章的学习能够对ZooKeeper的机制有一个全面的了解。另外,希望大家能够亲自动手编写Zookeeper程序,这样可以促进对ZooKeeper更深入的了解。