ZooKeeper分布式任务调度中心

一: 背景

软件系统中,定时任务往往不可或缺,大家可能会采用Spring  quartz 建立定时任务模块。 当任务模块进行了分布式部署,通常会出现定时任务重复执行的情况。 怎么避免这种情况呢,是否可以构建一个任务注册中心,Quartz负责注册任务,但不具体执行任务内的业务逻辑。

任务注册中心解决任务重复注册的问题,同时将任务分配给若干处理器进行具体的业务处理,保证在同一个时间内,一个任务只会被一个处理器进行处理。如下图



二:任务注册中心与调度中心

采用ZooKeeper的客户端框架Curator,  利用ZooKeeper的Master选举机制实现。 注册任务就相当于在ZooKeeper中创建或更新一个节点。通过更新节点的内容,来记录任务的执行状态。

三:代码模拟


点击(此处)折叠或打开

public class ZookeeperDemo5 {

    private static String PATH = "/zkbk2";
    private static String FINISH_FLAG="finish";

    private static CuratorFramework client = CuratorFrameworkFactory.builder()
            .connectString("10.243.3.18:2181,10.243.3.17:2181,10.243.3.27:2181").sessionTimeoutMs(5000)
            .retryPolicy(new ExponentialBackoffRetry(100, 3)).build();

    public static void main(String[] args) throws Exception {
        client.start();
        PathChildrenCache cache = new PathChildrenCache(client, PATH, true);
        cache.start(StartMode.POST_INITIALIZED_EVENT);

        cache.getListenable().addListener(new PathChildrenCacheListener() {

            @Override
            public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) {
                switch (event.getType()) {
                    case CHILD_ADDED:
                        System.out.println("CHILD_ADDED," + event.getData().getPath());
                        deal(event);
                        break;
                    case CHILD_UPDATED:
                        System.out.println("CHILD_UPDATED," + event.getData().getPath());
                        deal(event);
                        break;
                    case CHILD_REMOVED:
                        System.out.println("CHILD_REMOVED," + event.getData().getPath());
                        break;
                    default:
                        break;
                }
            }
        });

       Thread.sleep(Integer.MAX_VALUE);
    }
    
    
    
    
    private static void deal( PathChildrenCacheEvent event)
    {
        final LeaderLatch latch = new LeaderLatch(client, event.getData().getPath());

        latch.addListener(new LeaderLatchListener() {

            @Override
            public void notLeader() {
            }

            @Override
            public void isLeader() {
                try {
                    System.out.println("======begin deal==========" + event.getData().getPath());

                    String data = new String(client.getData().forPath(event.getData().getPath()));
                   

                    if (!data.contains("finish")) {
                        Thread.sleep(10000L);
                        System.out.println("");
                        System.out.println("");
                        System.out.println("**************************************");
                        System.out.println("**************************************");
                        System.out.println("**************************************");
                        System.out.println("**************************************");
                        System.out.println("");
                        System.out.println("");
                        client.setData().forPath(event.getData().getPath(), FINISH_FLAG.getBytes());
                    }
                    System.out.println("======finish deal==========" + event.getData().getPath());
                    latch.close();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        try {
            latch.start();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-2137933/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28624388/viewspace-2137933/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值