java在zookeeper节点上注册监听器

使用Zookeeper的注册监听功能,实现内容的同步更新:

引入的包

    com.101tec
    zkclient
    0.10
代码实现

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

 


 

你可能感兴趣的:(Java,zookeeper)