1、安装zookeeper以及以及ZooInspector
注:zookeeper打开为什么会一闪而过?
因为配置原因,conf文件夹加一个名为zoo.cfg的配置文件
2、主要是分布式用
练习1,zookeeper和java的结合使用1)
package com.sunlala;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class ZookeeperTest {
//连接地址
private static final String ADDRES = "127.0.0.1:2181";
//Session 会话
private static final int SESSION_OUTTIME = 2000;
//信号量,阻塞程序使用,用户等待zookeeper连接成功,发送信号量
private static final CountDownLatch countDonwnLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(ADDRES, SESSION_OUTTIME, new Watcher() {
public void process(WatchedEvent watchedEvent) {
//获取事件状态
Event.KeeperState keeperState = watchedEvent.getState();
//获取事件类型
Event.EventType eventType = watchedEvent.getType();
if(Event.KeeperState.SyncConnected == keeperState){
if (Event.EventType.None == eventType){
System.out.println("zk 启动连接。。");
// countDonwnLatch.countDown();
}
}
}
});
//进行阻塞
// countDonwnLatch.await();
String result = zk.create("/Lala001_permanent","permanent".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //持久节点
System.out.println(result);
zk.close();
}
}
上面代码可以正常启动zookeeper,再创建持久节点
2)因为子线程阻塞导致,zookeeper无法正常启动
package com.sunlala;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class ZookeeperTest {
//连接地址
private static final String ADDRES = "127.0.0.1:2181";
//Session 会话
private static final int SESSION_OUTTIME = 2000;
//信号量,阻塞程序使用,用户等待zookeeper连接成功,发送信号量
private static final CountDownLatch countDonwnLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(ADDRES, SESSION_OUTTIME, new Watcher() {
public void process(WatchedEvent watchedEvent) {
//获取事件状态
Event.KeeperState keeperState = watchedEvent.getState();
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取事件类型
Event.EventType eventType = watchedEvent.getType();
if(Event.KeeperState.SyncConnected == keeperState){
if (Event.EventType.None == eventType){
System.out.println("zk 启动连接。。");
// countDonwnLatch.countDown();
}
}
}
});
//进行阻塞
// countDonwnLatch.await();
String result = zk.create("/Lala004_permanent","permanent".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//持久节点
System.out.println(result);
zk.close();
}
}
该结果发现 zookeeper的子线程没有走完主线程已经结束,极端情况下,甚至会出现zookeeper 对象没有创建好,就执行了下面主线程的内容,从而导致创建节点失败
3) 处理可能因为线程阻塞而导致节点无法创建的问题
package com.sunlala;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class ZookeeperTest {
//连接地址
private static final String ADDRES = "127.0.0.1:2181";
//Session 会话
private static final int SESSION_OUTTIME = 2000;
//信号量,阻塞程序使用,用户等待zookeeper连接成功,发送信号量
private static final CountDownLatch countDonwnLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(ADDRES, SESSION_OUTTIME, new Watcher() {
public void process(WatchedEvent watchedEvent) {
//获取事件状态
Event.KeeperState keeperState = watchedEvent.getState();
//获取事件类型
Event.EventType eventType = watchedEvent.getType();
if(Event.KeeperState.SyncConnected == keeperState){
if (Event.EventType.None == eventType){
System.out.println("zk 启动连接。。");
countDonwnLatch.countDown(); //改行代码会使信号量变成0,从而解除阻塞
}
}
}
});
//进行阻塞
countDonwnLatch.await();//初始化信号量为1,所以主线程该行代码后面的内容不会执行,知道信号量为0
String result = zk.create("/Lala004_permanent","permanent".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//持久节点
System.out.println(result);
zk.close();
}
}
注:多线程中 CountDownLatch的使用
4) 临时节点在zk关闭的时候就被删除了
package com.sunlala;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class ZookeeperTest {
//连接地址
private static final String ADDRES = "127.0.0.1:2181";
//Session 会话
private static final int SESSION_OUTTIME = 2000;
//信号量,阻塞程序使用,用户等待zookeeper连接成功,发送信号量
private static final CountDownLatch countDonwnLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeper zk = new ZooKeeper(ADDRES, SESSION_OUTTIME, new Watcher() {
public void process(WatchedEvent watchedEvent) {
//获取事件状态
Event.KeeperState keeperState = watchedEvent.getState();
//获取事件类型
Event.EventType eventType = watchedEvent.getType();
if(Event.KeeperState.SyncConnected == keeperState){
if (Event.EventType.None == eventType){
System.out.println("zk 启动连接。。");
countDonwnLatch.countDown(); //改行代码会使信号量变成0,从而解除阻塞
}
}
}
});
//进行阻塞
countDonwnLatch.await();//初始化信号量为1,所以主线程该行代码后面的内容不会执行,知道信号量为0
String result = zk.create("/Lala005_permanent","permanent".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(result);
zk.close();
}
}
上面代码执行完会发现zk上面没有Lala005_permanent 节点,因为立马执行了zk.close(); 这行代码,所以节点被删除了,可在这行代码之前线程休眠5秒看效果



