栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Zookeeper基础学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Zookeeper基础学习

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秒看效果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号