Zookeeper框架Curator之分布式DistributedBarrier -yellowcong

DistributedBarrier 、DistributedDoubleBarrier 两个类,可以用来做分布式多个服务器准备做一件事情。这事一个分布式的操作。

DistributedBarrier

这个里面做的是,将准备的多个线程,加一个启动的项目,有一个人做启动的操作

package com.yellowcong.zookeeper.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.barriers.DistributedBarrier;
import org.apache.curator.framework.recipes.barriers.DistributedDoubleBarrier;
import org.apache.curator.retry.ExponentialBackoffRetry;

/**
 * 创建日期:2017年10月14日 <br/>
 * 创建用户:yellowcong <br/>
 * 功能描述:
 */
public class CuratorDouble2 {

    private static final String CONNECT_PATH = "192.168.66.110:2181,192.168.66.110:2182,192.168.66.110:2183";

    // Session 超时时间
    private static final int SESSION_TIME_OUT = 60000;

    // 连接超时
    private static final int CONNECT_TIME_OUT = 5000;

    private static DistributedBarrier  barrier ;
    public static void main(String[] args) throws Exception {

        for(int i=0;i<5;i++){
            new Thread(new Runnable() {

                public void run() {
                    try {
                        // 1、设定重试策略
                        RetryPolicy retryPolicy = new ExponentialBackoffRetry(5000, 5);

                        // 2、获取工厂类
                        CuratorFramework cf = CuratorFrameworkFactory.builder().connectString(CONNECT_PATH).retryPolicy(retryPolicy)
                                .sessionTimeoutMs(SESSION_TIME_OUT).connectionTimeoutMs(CONNECT_TIME_OUT).build();

                        // 3、启动连接
                        cf.start();

                        //获取DistributedBarrier
                        barrier = new DistributedBarrier(cf, "/distributeBarrirer");
                        System.out.println(Thread.currentThread().getName()+"\t同时等待");
                        barrier.setBarrier();
                        barrier.waitOnBarrier();
                        System.out.println(Thread.currentThread().getName()+"\t执行操作");
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }).start();
        }

        Thread.sleep(10000);

        //删除所有的拦截,这个相当于第6个对象,吹口哨的对象,让5个线程同时跑
        if(barrier != null){
            System.out.println("启动所有线程");
            barrier.removeBarrier();
        }
    }
}


运行结果

都等待,等执行了removeBarrier,才会都启动

这里写图片描述

DistributedDoubleBarrier

这个分布式是,类始于CyclicBarrier 对象,等多个线程准备就绪了,就可以同时执行和同时退出了

package com.yellowcong.zookeeper.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.barriers.DistributedDoubleBarrier;
import org.apache.curator.retry.ExponentialBackoffRetry;

/**
 * 创建日期:2017年10月14日 <br/>
 * 创建用户:yellowcong <br/>
 * 功能描述:
 */
public class CuratorDouble {

    private static final String CONNECT_PATH = "192.168.66.110:2181,192.168.66.110:2182,192.168.66.110:2183";

    // Session 超时时间
    private static final int SESSION_TIME_OUT = 60000;

    // 连接超时
    private static final int CONNECT_TIME_OUT = 5000;

    public static void main(String[] args) {

        for(int i=0;i<5;i++){
            new Thread(new Runnable() {

                public void run() {
                    try {
                        // 1、设定重试策略
                        RetryPolicy retryPolicy = new ExponentialBackoffRetry(5000, 5);

                        // 2、获取工厂类
                        CuratorFramework cf = CuratorFrameworkFactory.builder().connectString(CONNECT_PATH).retryPolicy(retryPolicy)
                                .sessionTimeoutMs(SESSION_TIME_OUT).connectionTimeoutMs(CONNECT_TIME_OUT).build();

                        // 3、启动连接
                        cf.start();

                        //设置Barrier  5个同时准备的情况,这个是放在Thread 里面,就相当于每个线程都获取DistributedDoubleBarrier,然后更新操作里面的值
                        DistributedDoubleBarrier  barrier = new DistributedDoubleBarrier(cf, "/dobuleBarrirer", 5);
                        System.out.println(Thread.currentThread().getName()+"\t同时等待");
                        barrier.enter();
                        System.out.println(Thread.currentThread().getName()+"\t同时执行任务");
                        barrier.leave();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}




结果

这个没有吹哨的操作,直接线程数够了,就会启动

这里写图片描述

发布了5 篇原创文章 · 获赞 0 · 访问量 168

猜你喜欢

转载自blog.csdn.net/qq_44813090/article/details/104093971