原文出自:http://www.cnblogs.com/yjmyzz/p/4604864.html
ZK中的每个节点都可以存储一些轻量级的数据,这些数据的变化会同步到集群中的其它机器。在应用中程序员可以添加watcher来监听这些数据的变化,watcher只会触发一次,所以触发过后想要继续监听,必须再手动设置监听,这比较麻烦,好在ZkClient已经做了一些增强,在watcher的基础上,封装了所谓的Listener,开发人员只需要订阅Listener即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
package yjmyzz.test; import com.cnblogs.yjmyzz.domain.BaseBean; import org.I0Itec.zkclient.IZkDataListener; import org.I0Itec.zkclient.ZkClient; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.concurrent.TimeUnit; public class ZKTest extends BaseBean
{ private ZkClient
zk; private String
nodeName = "/myApp" ; @Before public void initTest()
{ super .setLoggerClass( this .getClass()); zk
= new ZkClient( "localhost:2181,localhost:2182,localhost:2183" ); } @After public void dispose()
{ zk.close(); logger.info( "zkclient
closed!" ); } @Test public void testListener() throws InterruptedException
{ //监听指定节点的数据变化 zk.subscribeDataChanges(nodeName, new IZkDataListener()
{ @Override public void handleDataChange(String
s, Object o) throws Exception
{ logger.info( "node
data changed!" ); logger.info( "node=>" +
s); logger.info( "data=>" +
o); logger.info( "--------------" ); } @Override public void handleDataDeleted(String
s) throws Exception
{ logger.info( "node
data deleted!" ); logger.info( "s=>" +
s); logger.info( "--------------" ); } }); logger.info( "ready!" ); //junit测试时,防止线程退出 while ( true )
{ TimeUnit.SECONDS.sleep( 5 ); } } @Test public void testUpdateConfig() throws InterruptedException
{ if (!zk.exists(nodeName))
{ zk.createPersistent(nodeName); } zk.writeData(nodeName, "1" ); zk.writeData(nodeName, "2" ); zk.delete(nodeName); zk.delete(nodeName); //删除一个不存在的node,并不会报错 } } |
上面的代码中,演示了如何监听/myApp的数据变化,用junit做单元测试时,步骤如下:
1. 先测试testListener()方法,由于这个方法最后,写了一个死循环,所以程序不会退出。
2. 紧接着再测试testUpdateConfig(),这个方法中修改了节点的数据。
此时,由于testListener中设置了监听,所以监听程序应该会起作用,打印出相应的数据变化,类似下面的效果:
yjmyzz.test.ZKTest - ready!
yjmyzz.test.ZKTest - node data changed!
yjmyzz.test.ZKTest - node=>/myApp
yjmyzz.test.ZKTest - data=>1
yjmyzz.test.ZKTest - --------------
yjmyzz.test.ZKTest - node data changed!
yjmyzz.test.ZKTest - node=>/myApp
yjmyzz.test.ZKTest - data=>2
yjmyzz.test.ZKTest - --------------
yjmyzz.test.ZKTest - node data deleted!
yjmyzz.test.ZKTest - s=>/myApp
yjmyzz.test.ZKTest - --------------
yjmyzz.test.ZKTest - node data deleted!
yjmyzz.test.ZKTest - s=>/myApp
yjmyzz.test.ZKTest - --------------