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更深入的了解。