Zookeeper客户端API之创建会话(六)

Zookeeper对外提供了一套Java的客户端API。本篇博客主要讲一下创建会话。

创建项目

首选,创建一个基于maven管理的简单java工程。在pom文件中引入zookeeper。

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.4.9</version>
</dependency>

编写测试类

首选以最简单的API为例。

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

其中,connectString表示要连接的zookeeper服务器地址列表,格式为:192.168.0.1:2181。支持多个地址拼接,中间用逗号分隔。其中地址后面还可以拼接上zookeeper的操作路径,比如:192.168.0.1:2181/zk/test。

sessionTimeout:会话超时时间,单位“毫秒”。通过心跳来监测会话的有效性。

watcher:监听节点的状态变化,如果发生变化则通知此watcher,做出相应处理。如果不需要监听,则可设置为null。

测试代码:

package com.secbro.learn;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

/**
 * Created by zhuzs on 2017/3/9.
 */
public class TestSession implements Watcher{

    private static CountDownLatch countDownLatch = new CountDownLatch(1);
    public static void main(String[] args) throws IOException {
        Long startTime = new Date().getTime();
        ZooKeeper zooKeeper = new ZooKeeper("192.168.0.1:2181",5000,new TestSession());
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("创建连接花费时间:" + (new Date().getTime() - startTime) + "ms");
        System.out.println("连接状态:" + zooKeeper.getState());
    }

    public void process(WatchedEvent event) {
        System.out.println("Receive watcher event:" + event);
        if(Event.KeeperState.SyncConnected == event.getState()){
            countDownLatch.countDown();
        }
    }
}

由于Zookeeper客户端和服务器创建会话是异步过程,因此使用CountDownLatch来阻塞线程,等待服务器创建完成,并发送事件通知。

打印结果为:

Receive watcher event:WatchedEvent state:SyncConnected type:None path:null
创建连接花费时间:9155ms
连接状态:CONNECTED

其他接口

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
            boolean canBeReadOnly)

此方法多了一个canBeReadOnly参数,此参数表示当前会话是否支持“只读”模式。

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
            long sessionId, byte[] sessionPasswd)

此方法允许传入sessionId和sessionPasswd,目的是为了重复使用会话。通过以下方法获得:

zooKeeper.getSessionId();
zooKeeper.getSessionPasswd()

然后作为参数创建新的连接。当sessionId和sessionPasswd不正确时,服务器会返回Expired事件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现

      前面的文章AgileEAS.NET之插件接口IModule对插件的基本契约宝义也就是接口做了一个介绍,本文将提供另一种模块插件的定义,采用属性标记插...

20750
来自专栏码农阿宇

EF Core利用Transaction对数据进行回滚保护

What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用...

38950
来自专栏魏琼东

分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载

     在很多MIS项目之中都有这样的需求,需要一个及时、高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下...

46200
来自专栏抠抠空间

Django之admin的使用和源码剖析

19600
来自专栏calvin

.net core 源码解析-web app是如何启动并接收处理请求

最近.net core 1.1也发布了,蹒跚学步的小孩又长高了一些,园子里大家也都非常积极的在学习,闲来无事,扒拔源码,涨涨见识。

16110
来自专栏空间大数据可视化

利用iframe+from表单实现跨域上传文件

14940
来自专栏领域驱动设计DDD实战进阶

微服务实战(七):落地微服务架构到直销系统(实现命令与命令处理器)

我们先来看看CQRS架构,你对下图的架构还有印象吗?每个组件的功能都还清楚吗?如果有疑问,请查考文章《微服务实战(五):落地微服务架构到直销系统(构建高性能大并...

20930
来自专栏大内老A

ASP.NET Core应用的错误处理[4]:StatusCodePagesMiddleware中间件如何针对响应码呈现错误页面

StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件比较类似,它们都是在后续请求处理过程中“出错...

51050
来自专栏晓晨的专栏

asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法

21150
来自专栏石奈子的Java之路

原 荐 Java9之HttpClientAP

28920

扫码关注云+社区

领取腾讯云代金券