ITPub博客

首页 > 应用开发 > IT综合 > ZooKeeper分布式任务调度中心

ZooKeeper分布式任务调度中心

原创 IT综合 作者:百联达 时间:2017-04-25 12:27:20 0 删除 编辑
一: 背景

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

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



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

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

三:代码模拟


点击(此处)折叠或打开

  1. public class ZookeeperDemo5 {

  2.     private static String PATH = "/zkbk2";
  3.     private static String FINISH_FLAG="finish";

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

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

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

  12.             @Override
  13.             public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) {
  14.                 switch (event.getType()) {
  15.                     case CHILD_ADDED:
  16.                         System.out.println("CHILD_ADDED," + event.getData().getPath());
  17.                         deal(event);
  18.                         break;
  19.                     case CHILD_UPDATED:
  20.                         System.out.println("CHILD_UPDATED," + event.getData().getPath());
  21.                         deal(event);
  22.                         break;
  23.                     case CHILD_REMOVED:
  24.                         System.out.println("CHILD_REMOVED," + event.getData().getPath());
  25.                         break;
  26.                     default:
  27.                         break;
  28.                 }
  29.             }
  30.         });

  31.        Thread.sleep(Integer.MAX_VALUE);
  32.     }
  33.     
  34.     
  35.     
  36.     
  37.     private static void deal( PathChildrenCacheEvent event)
  38.     {
  39.         final LeaderLatch latch = new LeaderLatch(client, event.getData().getPath());

  40.         latch.addListener(new LeaderLatchListener() {

  41.             @Override
  42.             public void notLeader() {
  43.             }

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

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

  50.                     if (!data.contains("finish")) {
  51.                         Thread.sleep(10000L);
  52.                         System.out.println("");
  53.                         System.out.println("");
  54.                         System.out.println("**************************************");
  55.                         System.out.println("**************************************");
  56.                         System.out.println("**************************************");
  57.                         System.out.println("**************************************");
  58.                         System.out.println("");
  59.                         System.out.println("");
  60.                         client.setData().forPath(event.getData().getPath(), FINISH_FLAG.getBytes());
  61.                     }
  62.                     System.out.println("======finish deal==========" + event.getData().getPath());
  63.                     latch.close();
  64.                 }
  65.                 catch (Exception e) {
  66.                     e.printStackTrace();
  67.                 }
  68.             }
  69.         });
  70.         try {
  71.             latch.start();
  72.         }
  73.         catch (Exception e) {
  74.             e.printStackTrace();
  75.         }
  76.     }
  77. }


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

请登录后发表评论 登录
全部评论
15年以上互联网经验,先后从事过制造业,证券业,物业行业和物流行业信息系统和互联网产品的设计落地实施,8年系统架构经验。最近关注企业数字化转型、财务数字化服务共享、大语言模型、Kubernetes微服务架构和Istio微服务治理框架。

注册时间:2013-02-05

  • 博文量
    332
  • 访问量
    1265609