curator实现分布式任务调度

public interface ClusterLeaderListener {

    public void gainLeader();

    public void loserLeader();
}

public interface ClusterManager {

/**
 * 获取leader节点
 * @throws Exception
 */
void acquireLeader() throws Exception;

/**
 * 关闭leader选举
 * @throws Exception
 */
void closeLeaderLatch() throws Exception;

/**
 * 开始leader选举
 * @throws Exception
 */
void startLeaderLatch() throws Exception;

/**
 * 添加监听器
 * @throws Exception
 */
void addLeaderListener(ClusterLeaderListener listener) throws Exception;
}

/**
 * 连接zookeeper服务器,leader选举
 * @author hao.wang 2017年1月18日 下午5:29:44
 *
 */
public class ZookeeperClusterManager implements ClusterManager{

    private CuratorFramework framework;

    private LeaderLatch leaderLatch;

    private static List<ClusterLeaderListener> listeners = new ArrayList<ClusterLeaderListener>();

    private volatile boolean isLeaderLatchStart = false;

    private static final String DETAULE_ELECTION_PATH = "/election/demo/hao";


    public ZookeeperClusterManager() {
        framework= CuratorFrameworkFactory.newClient("139.199.182.26:5000",30000,5000,
                new ExponentialBackoffRetry(2000,Integer.MAX_VALUE));
        framework.start();
        leaderLatch = new LeaderLatch(framework, DETAULE_ELECTION_PATH);
        try {
            leaderLatch.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
        isLeaderLatchStart = true;
        leaderLatch.addListener(new LeaderLatchListener() {

            @Override
            public void notLeader() {
                synchronized(this){
                    if(!listeners.isEmpty()){
                        for (ClusterLeaderListener listener : listeners) {
                            listener.loserLeader();
                        }
                    }
                }
            }

            @Override
            public void isLeader() {
                synchronized(this){
                    if(!listeners.isEmpty()){
                        for (ClusterLeaderListener listener : listeners) {
                            listener.gainLeader();
                        }
                    }
                }
            }
        });
    }

    @Override
    public void acquireLeader() throws Exception {
        this.leaderLatch.await();
    }

    @Override
    public void closeLeaderLatch() throws Exception {
        this.leaderLatch.close();

    }

    @Override
    public void startLeaderLatch() throws Exception {
        if(!isLeaderLatchStart){
            this.leaderLatch.start();
        }


    }

    @Override
    public void addLeaderListener(ClusterLeaderListener listener) throws Exception {
        if(!this.listeners.contains(listener)){
            listeners.add(listener);
        }
    }

}

public interface SchedulerBootstrap {


    void start() throws Exception;

    void stop() throws Exception;
}

public class SchedulerBootstrapImpl implements SchedulerBootstrap {

    private String serverName;

    private ClusterManager clusterManager = new ZookeeperClusterManager();

    private volatile boolean shutDown = false;

    public SchedulerBootstrapImpl(String serverName) {
        this.serverName = serverName;
    }

    @Override
    public void start() throws Exception {
        if (shutDown) {
            throw new RuntimeException("任务已经停止");
        }
        boolean leaderAcuqire = false;
        // 这个过程就是获取leader权限
        while (!Thread.currentThread().isInterrupted()) {
            try {
                clusterManager.acquireLeader();
                leaderAcuqire = true;
                break;
            } catch (Exception e) {
                if (e instanceof InterruptedException) {
                    Thread.currentThread().interrupt();
                    return;
                }
                if (shutDown) {
                    return;
                }
                Thread.sleep(5000);
            }
        }
        System.out.println(serverName + "获得处理权力,开始执行任务");
        if (leaderAcuqire) {
            startService();
        }

        clusterManager.addLeaderListener(new ClusterLeaderListener() {

            @Override
            public void gainLeader() {
                // 获得leader权力,执行任务
                startService();
            }

            @Override
            public void loserLeader() {
                // 丢失leader权力,关闭任务
                destoryService();
            }

        });
    }

    @Override
    public void stop() throws Exception {
        destoryService();
        shutDown = true;
    }

    private void startService() {
        SchedulerService.startTimer(serverName);
        try {
            clusterManager.startLeaderLatch();
        } catch (Exception e) {
            SchedulerService.stopTimer(serverName);
            try {
                clusterManager.closeLeaderLatch();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }

    private void destoryService() {
        SchedulerService.stopTimer(serverName);
        try {
            clusterManager.closeLeaderLatch();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public class SchedulerService {

    static ScheduledExecutorService service = Executors.newScheduledThreadPool(10);

    public static void startTimer(final String serverName){
        service.scheduleAtFixedRate(()->{
            System.out.println("我是服务器"+serverName +",开始已执行任务");
        }, 5,1, TimeUnit.SECONDS);

    }
    public static void stopTimer(final String serverName){
          System.out.println("我是服务器:"+serverName+",停止执行任务");
        service.shutdown();

    }
}

public class App1 {
    public static void main(String[] args) {
        SchedulerBootstrap sb = new SchedulerBootstrapImpl("服务1");
        try {
            sb.start();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public class App2 {
    public static void main(String[] args) {
        SchedulerBootstrap sb = new SchedulerBootstrapImpl("服务2");
        try {
            sb.start();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值