文档章节

zookeeper jar使用

 我就是我110
发布于 2015/08/14 10:55
字数 879
阅读 213
收藏 5

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>test-demo</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>test-demo Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <junit.version>4.12</junit.version>
        <zkclient.version>2.1.1</zkclient.version>
        <zookeeper.version>3.4.6</zookeeper.version>
        <slf4j-log4j12.version>1.7.12</slf4j-log4j12.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <!--<scope>test</scope>-->
        </dependency>
        <!--
        <dependency>
            <groupId>com.github.adyliu</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkclient.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>compile</scope>
        </dependency>
        -->

        <!--zookeeper java客户端-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>jline</groupId>
                    <artifactId>jline</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--日志相关-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j-log4j12.version}</version>
        </dependency>

    </dependencies>
    <build>
        <finalName>test-demo</finalName>
    </build>
</project>

log4j.properties

log4j.rootCategory=info,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.encoding=utf-8
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%p]%d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n

java类

package com.test.zk;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * zookeeper java客户端学习
 * Created on 2015/8/13.
 */
public class ZkTest {
    private final Logger logger = LoggerFactory.getLogger(ZkTest.class);

    private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private String address = "127.0.0.1:8080";
    private Integer timeOut = 600000;
    private String path;
    private ZooKeeper zooKeeper;
    private Watcher watcher;

    //测试权限控制的参数
    private String auth_type;
    private String auth;
    private String p;

    @Before
    public void init() {
        try {
            auth_type = "digest";
            auth = "joey:some";
            p = "/acl_digest";
            path = "/test";
            watcher = new Watcher() {
                public void process(WatchedEvent event) {
                    logger.info("watcher info..." + event.toString());
                }
            };
            zooKeeper = new ZooKeeper(address, timeOut, watcher);
            logger.info("zookeeper注册成功...");
        } catch (IOException e) {
            logger.error("初始化zookeeper失败...", e);
        }
    }

    //@Test
    public void add() {
        try {
            watcher = new Watcher() {
                public void process(WatchedEvent event) {
                    logger.info("exists watcher..." + event.toString());
                }
            };
            Stat stat = zooKeeper.exists(path, true);//stat代表节点信息
            //如果path不存在  返回null
            logger.info(stat.toString());
            if (stat != null) {
                byte[] bytes = zooKeeper.getData(path, true, stat);
                String result = new String(bytes, "UTF-8");
                logger.info("getData ersult..." + result);
                logger.info("getData stat..." + stat.toString());
            }
        } catch (Exception e) {
            logger.error(path + "是否存在出错..", e);
        }
    }

    //此方法不建议使用
    //@Test
    public void aclAuthCreate() {
        zooKeeper.addAuthInfo(auth_type, auth.getBytes());
        try {
            zooKeeper.create(p, "hello".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
        } catch (Exception e) {
            logger.error("权限控制创建节点出错...", e);
        }
    }

    //@Test
    public void aclAuthGet() {
        zooKeeper.addAuthInfo(auth_type, auth.getBytes());
        Stat stat = new Stat();
        try {
            zooKeeper.getData(p, null, stat);
            logger.info(p + "创建时间" + (df.format(new Timestamp(stat.getCtime()))));
        } catch (Exception e) {
            logger.error("获取权限控制节点数据异常...", e);
        }

    }

    //实现创建一个节点,给不同用户赋予不同权利
    //@Test
    public void testAcl() {
        try {
            List<ACL> acls = new ArrayList<ACL>(2);

            Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));
            ACL acl1 = new ACL(ZooDefs.Perms.ALL, id1);

            Id id2 = new Id("digest", DigestAuthenticationProvider.generateDigest("guest:guest123"));
            ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);

            acls.add(acl1);
            acls.add(acl2);
            zooKeeper.create("/testAcl", "testAclValue".getBytes(), acls, CreateMode.PERSISTENT);
        } catch (Exception e) {
            logger.error("测试zookeeper权限出错...",e);
        }
    }

    //测试watcher
    //@Test
    public void testWatcher() {
        try {
            DefaultWatcher defaultWatcher = new DefaultWatcher();
            ExistsWatcher existsWatcher = new ExistsWatcher();
            String p = "/watcher";

            zooKeeper.register(defaultWatcher);//通过构造方法或者register指定的watcher一直有效

            Stat stat = zooKeeper.exists(p, existsWatcher);//这种方式的watcher只生效一次
            zooKeeper.create(p, p.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//触发上一步设置的watcher

            //exists watcher=true 方式不会触发
            stat = zooKeeper.exists(p, true);
            byte[] b = zooKeeper.getData(p, true, stat);
            System.out.println(new String(b));

            stat = zooKeeper.exists(p, true);
            zooKeeper.setData(p, "Iloveyou".getBytes(), stat.getVersion());

            //set watcher方式会触发
            stat = zooKeeper.exists(p, existsWatcher);
            zooKeeper.delete(p, stat.getVersion());
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    //测试异步调用getData
    @Test
    public void testSync(){
        String p = "/lf";//已经在zookeeper中创建此节点
        zooKeeper.getData(p, false, new AsyncCallback.DataCallback() {
            public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
                logger.info(path+"值为"+new String(data));
                logger.info("外部参数传递:"+ctx);
            }
        }, "hello world!");
    }

    @After
    public void destory() {
        if (zooKeeper != null) {
            try {
                zooKeeper.close();
                logger.info("关闭zookeeper");
            } catch (InterruptedException e) {
                logger.error("关闭zookeeper异常..", e);
            }
        }
    }


    class ExistsWatcher implements Watcher {
        public void process(WatchedEvent event) {
            System.out.println("---------------------------");
            System.out.println("setting by exist watcher");
            System.out.println("path is : " + event.getPath());
            System.out.println("type is : " + event.getType());
            System.out.println("state is : " + event.getState());
            System.out.println("---------------------------");
        }
    }
    class DefaultWatcher implements Watcher {
        public void process(WatchedEvent event) {
            System.out.println("=====>Default Watch Event,patch:" + event.getPath()+",type:"+event.getType());
        }
    }

}

 

© 著作权归作者所有

粉丝 0
博文 7
码字总数 6140
作品 0
大兴
私信 提问
ZooKeeper 使用 ZKClient 获取子节点列表

ZkClient 是一个开源软件,也托管在 github。它封装了 zookeeper 原生 API。 使用 先需要在 javaws 网站上下载 ZKClient 的 jar 包。 注意 中的 IP 地址应该和 中配置的 IP 地址一致,且在 ...

兔之
2015/10/27
0
0
使用Curator实现的zookeeper分布式锁出现的Unimplemented for {root.path}

问题描述 Curator使用 ZooKeeper 作为分布式锁,启动时发生该异常。 Curator 客户端版本:curator-recipes-2.10.0 ZooKeeper 服务器版本:3.4.13 异常日志 以及 问题分析 UnimplementedExcep...

loubobooo
02/27
0
0
dubbo + zookeeper的相关应用

一、首先介绍下DUBBO的背景 随着互联网的发展,一些大型网站的规模不断扩大,常规的垂直应用架构已经无法满足,分布式架构已经势在必行,DUBBO是一个分布式服务框架,在这种情况下诞生的。 ...

zheng854938169
2018/06/28
0
0
Dubbo分布式框架:(二)Zookeeper实战

一.Zookeeper简介 讲到Dubbo不得不说它的核心组件Zookeeper,ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它...

HaleyLiu
2018/05/04
0
0
ZooKeeper的Watcher机制

ZooKeeper 提供了分布式数据的发布/订阅功能。 在 ZooKeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。 ZooKeeper 允许客户端向服务端注册一个 Watcher 监听, 当服务器的一些特...

Java搬砖工程师
2018/11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

import java.util.Arrays; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Arrays.sort(array); int count=0; for(int i=0;i<array.le......

南桥北木
10分钟前
0
0
关于FLAG_ACTIVITY_NEW_TASK的使用

参考文章: https://blog.csdn.net/u010389391/article/details/78558475 Context调用startActivity, 有部分情况会报出如下错误: Caused by: android.util.AndroidRuntimeException: Calli......

Gemini-Lin
25分钟前
0
0
Python开发工具:Webware for Python

原文来之:https://www.oschina.net/p/webware+for+python 前言 Webware for Python 是一组 Python 包和工具用来开发面向对象的 Web 应用。良好的设计模式,包含一个快速的应用服务器、Servl...

A_裙232550246
34分钟前
0
0
高并发场景下的缓存有哪些常见的问题?

一、缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。 这就比较依赖缓存的过期和更新...

别打我会飞
49分钟前
3
0
List list = new ArrayList()为何父类引用指向子类对象(多态)

态:要有继承,方法的重写,父类引用指向子类对象 疑问一:父类引用指向子类对象 与指向父类对象 Animal cat = new Cat(); //向上转型。 父类引用指向子类对象,该引用不能再访问子类新增加的...

architect刘源源
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部