package com.embracesource.config; import java.util.List; import org.I0Itec.zkclient.IZkDataListener; import org.I0Itec.zkclient.ZkClient; import org.apache.commons.lang.StringUtils; /** * 订阅者实现类,当订阅到zk数据改变时,会触发ConfigChangeListener * * @author june * */ public class ZkConfigChangeSubscriberImpl implements ConfigChangeSubscriber { private ZkClient zkClient; private String rootNode; public ZkConfigChangeSubscriberImpl(ZkClient zkClient, String rootNode) { this.rootNode = rootNode; this.zkClient = zkClient; } public void subscribe(String key, ConfigChangeListener listener) { String path = ZkUtils.getZkPath(this.rootNode, key); if (!this.zkClient.exists(path)) { throw new RuntimeException( "配置(" + path + ")不存在, 必须先定义配置才能监听配置的变化, 请检查配置的key是否正确, 如果确认配置key正确, 那么需要保证先使用配置发布命令发布配置! "); } this.zkClient.subscribeDataChanges(path, new DataListenerAdapter( listener)); } /** * 触发ConfigChangeListener * * @param path * @param value * @param configListener */ private void fireConfigChanged(String path, String value, ConfigChangeListener configListener) { configListener.configChanged(getKey(path), value); } private String getKey(String path) { String key = path; if (!StringUtils.isEmpty(this.rootNode)) { key = path.replaceFirst(this.rootNode, ""); if (key.startsWith("/")) { key = key.substring(1); } } return key; } public String getInitValue(String key) { String path = ZkUtils.getZkPath(this.rootNode, key); return (String) this.zkClient.readData(path); } public List<String> listKeys() { return this.zkClient.getChildren(this.rootNode); } /** * 数据监听器适配类,当zk数据变化时,触发ConfigChangeListener * * @author june * */ private class DataListenerAdapter implements IZkDataListener { private ConfigChangeListener configListener; public DataListenerAdapter(ConfigChangeListener configListener) { this.configListener = configListener; } public void handleDataChange(String s, Object obj) throws Exception { ZkConfigChangeSubscriberImpl.this.fireConfigChanged(s, (String) obj, this.configListener); } public void handleDataDeleted(String s) throws Exception { } } }