java在zookeeper節點上註冊監聽器

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

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章