java zk监听异步_zookeeper持续监听znode节点变化

总共两个类 代码就不多讲了.

main测试主方法在类Executor里。

Executor类

package com.steven.test.zk;

/**

* A simple example program to use DataMonitor to start and

* stop executables based on a znode. The program watches the

* specified znode and saves the data that corresponds to the

* znode in the filesystem. It also starts the specified program

* with the specified arguments when the znode exists and kills

* the program if the znode goes away.

*/

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Executor implements Watcher, Runnable, DataMonitor.DataMonitorListener {

String znode;

DataMonitor dm;

ZooKeeper zk;

Process child;

public Executor(String hostPort, String znode) throws KeeperException, IOException {

zk = new ZooKeeper(hostPort, 3000, this);

dm = new DataMonitor(zk, znode, null, this);

}

/**

* @param args

*/

public static void main(String[] args) {

args = new String[]{"localhost:2181","/teststeven"};

String hostPort = args[0];

String znode = args[1];

try {

new Executor(hostPort, znode).run();

} catch (Exception e) {

e.printStackTrace();

}

}

/***************************************************************************

* We do process any events ourselves, we just need to forward them on.

*

* @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.proto.WatcherEvent)

*/

public void process(WatchedEvent event) {

dm.process(event);

}

public void run() {

try {

synchronized (this) {

while (!dm.dead) {

wait();

}

}

} catch (InterruptedException e) {

}

}

public void closing(int rc) {

synchronized (this) {

notifyAll();

}

}

static class StreamWriter extends Thread {

OutputStream os;

InputStream is;

StreamWriter(InputStream is, OutputStream os) {

this.is = is;

this.os = os;

start();

}

public void run() {

byte b[] = new byte[80];

int rc;

try {

while ((rc = is.read(b)) > 0) {

os.write(b, 0, rc);

}

} catch (IOException e) {

}

}

}

public void exists(byte[] data) {

if (data == null) {

if (child != null) {

System.out.println("Killing process");

child.destroy();

try {

child.waitFor();

} catch (InterruptedException e) {

}

}

child = null;

} else {

if (child != null) {

System.out.println("Stopping child");

child.destroy();

try {

child.waitFor();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//other class

}

}

}

DataMonitor类

要监控数据主要看DataMonitor类

/**

* A simple class that monitors the data and existence of a ZooKeeper

* node. It uses asynchronous ZooKeeper APIs.

*/

import java.util.Arrays;

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

import org.apache.zookeeper.AsyncCallback.StatCallback;

import org.apache.zookeeper.KeeperException.Code;

import org.apache.zookeeper.data.Stat;

public class DataMonitor implements Watcher, StatCallback {

ZooKeeper zk;

String znode;

Watcher chainedWatcher;

boolean dead;

DataMonitorListener listener;

byte prevData[];

public DataMonitor(ZooKeeper zk, String znode, Watcher chainedWatcher, DataMonitorListener listener) {

this.zk = zk;

this.znode = znode;

this.chainedWatcher = chainedWatcher;

this.listener = listener;

// Get things started by checking if the node exists. We are going

// to be completely event driven

zk.exists(znode, true, this, null);

}

/**

* Other classes use the DataMonitor by implementing this method

*/

public interface DataMonitorListener {

/**

* The existence status of the node has changed.

*/

void exists(byte data[]);

/**

* The ZooKeeper session is no longer valid.

*

* @param rc

* the ZooKeeper reason code

*/

void closing(int rc);

}

public void process(WatchedEvent event) {

String path = event.getPath();

if (event.getType() == Event.EventType.None) {

// We are are being told that the state of the

// connection has changed

switch (event.getState()) {

case SyncConnected:

// In this particular example we don't need to do anything

// here - watches are automatically re-registered with

// server and any watches triggered while the client was

// disconnected will be delivered (in order of course)

break;

case Expired:

// It's all over

dead = true;

listener.closing(KeeperException.Code.SessionExpired);

break;

}

} else {

if (path != null && path.equals(znode)) {

// Something has changed on the node, let's find out

zk.exists(znode, true, this, null);

}

}

if (chainedWatcher != null) {

chainedWatcher.process(event);

}

}

public void processResult(int rc, String path, Object ctx, Stat stat) {

boolean exists;

switch (rc) {

case Code.Ok:

exists = true;

break;

case Code.NoNode:

exists = false;

break;

case Code.SessionExpired:

case Code.NoAuth:

dead = true;

listener.closing(rc);

return;

default:

// Retry errors

zk.exists(znode, true, this, null);

return;

}

byte b[] = null;

if (exists) {

try {

b = zk.getData(znode, false, null);

} catch (KeeperException e) {

// We don't need to worry about recovering now. The watch

// callbacks will kick off any exception handling

e.printStackTrace();

} catch (InterruptedException e) {

return;

}

}

if ((b == null && b != prevData) || (b != null && !Arrays.equals(prevData, b))) {

listener.exists(b);

prevData = b;

}

}

}

其实官方已经给出监听文档,百度搜索代码的质量越来越low了,搜出来的东西还是一个模子刻出来。

参考官网地址:https://zookeeper.apache.org/doc/r3.1.2/javaExample.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值