使用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();
}
}
}
|