/** * Tencent is pleased to support the open source community by making MSEC available. * * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the GNU General Public License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. You may * obtain a copy of the License at * * https://opensource.org/licenses/GPL-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ package msec.org; import org.apache.zookeeper.*; import java.util.*; import java.util.concurrent.CountDownLatch; /** * Created by Administrator on 2016/3/2. */ public class AccessZooKeeper { private CountDownLatch countDownLatch=new CountDownLatch(1); private ZooKeeper zk = null; // private String connectStr = "127.0.0.1:2181"; private String connectStr = "localhost:8972"; public AccessZooKeeper() { connectZooKeeper(); } private void connectZooKeeper() { try { zk = new ZooKeeper(connectStr, 5000, new Watcher() { @Override public void process(WatchedEvent event) { if(event.getState()== Event.KeeperState.SyncConnected){ countDownLatch.countDown(); } } }); countDownLatch.await(); } catch (Exception e) { e.printStackTrace(); } } public boolean isConnected() { return zk.getState().isConnected(); } public void disconnect() { try { zk.close(); } catch (Exception e) {} } public String write(String path, byte[] data) throws Exception { return write(path, data, true); } public String write(String path, byte[] data, boolean persistent) throws Exception { if (path.length() < 2) { return "path invalid";} if (path.substring(path.length()-1).equals("/")) //以 /结尾的话 { path = path.substring(0, path.length()-1);//去掉末尾的/ } //获得各级父节点的路径 ArrayList<String> parents = new ArrayList<String>(); int begin = 1; while (true) { int index = path.indexOf("/", begin); if (index < 0) { break; } String substr = path.substring(0, index); parents.add(substr); begin = index+1; } //逐级创建父节点 for (int i = 0; i < parents.size(); i++) { try { zk.create(parents.get(i), null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } catch (KeeperException.NodeExistsException e) { } } //创建节点本身 try { if (persistent) { zk.create(path, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } else { zk.create(path, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); } } catch (KeeperException.NodeExistsException e) { } //写数据 zk.setData(path, data, -1);//如果不存在就抛出异常,他妈的搞的真不优雅 return "success"; } public byte[] read(String path) throws Exception { try { byte[] data = zk.getData(path, null, null); return data; } catch (KeeperException.NoNodeException e) { return null; } } public void deleteRecursive( final String pathRoot) throws InterruptedException, KeeperException { // PathUtils.validatePath(pathRoot); List<String> tree = listSubTreeBFS( pathRoot); for (int i = tree.size() - 1; i >= 0 ; --i) { //Delete the leaves first and eventually get rid of the root try { zk.delete(tree.get(i), -1); //Delete all versions of the node with -1. } catch (KeeperException.NoNodeException e) { //算成功哦 } catch (Exception e) { throw e; } } } private List<String> listSubTreeBFS( final String pathRoot) throws KeeperException, InterruptedException { Deque<String> queue = new LinkedList<String>(); List<String> tree = new ArrayList<String>(); queue.add(pathRoot); tree.add(pathRoot); while (true) { String node = queue.pollFirst(); if (node == null) { break; } try { List<String> children = zk.getChildren(node, false); for (final String child : children) { final String childPath = node + "/" + child; queue.add(childPath); tree.add(childPath); } } catch (KeeperException.NoNodeException e) { //不存在算成功哦,可以删除不存在的node } } return tree; } }