使用Zookeeper的注册监听功能,实现内容的同步更新:
引入的包<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> |
代码实现package com.test; import org.I0Itec.zkclient.IZkDataListener; import org.I0Itec.zkclient.ZkClient; /** * 内存数据版本控制 * 1. 从zk监听数据版本号的变化 * 2. 若版本变化且比当前版本高,则重新从redis中加载数据 * @author Administrator * */ public class VersionChangeService { private String contentNode = "/contentversion"; //版本控制的节点名称 private String host = "127.0.0.1:2181"; // zk 地址,集群则逗号隔开 private ZkClient zkClient; /** * ContentAPI 注册监听, contentNode 内容有任何变化,则通知重新从redis中加载数据 */ public void subscribeDataChanges() { zkClient = new ZkClient(host); if(!zkClient.exists(contentNode)) { zkClient.createPersistent(contentNode); } //注册监听事件 zkClient.subscribeDataChanges(contentNode, new IZkDataListener() { /** * arg0:监听的目录 */ public void handleDataDeleted(String arg0) throws Exception { System.out.println("Client0 DataDeleted : arg0="+arg0); } /** * arg0 : 监听的目录 * arg1 : 变化后的内容 */ public void handleDataChange(String arg0, Object arg1) throws Exception { System.out.println("Client0 DataChanged : arg0="+arg0+", arg1="+arg1); if(arg1 != null) { //int version = Integer.parseInt(arg1.toString()); //判断version版本号 // refresh(); 刷新数据 } } }); } /** * ContentService 加载完数据到redis中后,通知zk更新版本号 */ public void updateVersion() { ZkClient zkClient = new ZkClient(host); if(!zkClient.exists(contentNode)) { /** * PERSISTENT--持久化目录节点 * PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点 * EPHEMERAL-临时目录节点 * EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点 */ zkClient.createPersistent(contentNode); } for(int i=0;i<100;i++) { zkClient.writeData(contentNode, i); } } public static void main(String[] args) { new VersionChangeService().subscribeDataChanges(); System.out.println("VersionChangeService 已注册好监听"); try { Thread.sleep(Long.MAX_VALUE); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |