在实际的开发过程中,我们一定会遇到服务自有的定时任务,又因为现在的服务都是分布式的,但是对于定时任务,很多的业务场景下,还是只希望单台服务来执行,网上有很多分布式定时任务的框架,各位如感兴趣,可以自行去研究。本文采用非常简单的方式实现了分布式的定时任务,利用了zookeeper的节点的EPHEMERAL_SEQUENTIAL特性,适用范围:

1.定时任务跟随服务本身一起管理,不想引入过于复杂的分布式定时任务服务框架

2.已有分布式定时任务服务框架,但对于一些定时任务,服务本身对它进行管理更加方便

3.定时任务不要求100%的准确调度

源码 参考:https://github.com/mantuliu/javaAdvance :

package com.mantu.advance;

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids; /**
* blog http://www.cnblogs.com/mantu/
* github https://github.com/mantuliu/
* @author mantu
*
*/
public class Lesson9DistributedTask { public static String zkNode="";
public static ZooKeeper zk=null;
public static void main( String[] args )
{
try {
zk = new ZooKeeper("127.0.0.1:2181", 3000,new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) { }
});
//zk.create("/task","timer".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
//zk.create("/task/timer","timer".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
zkNode= zk.create("/task/timer/","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL).replaceAll("/task/timer/", "");
} catch (Exception e) {
e.printStackTrace();
}
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 2000);
}
} class MyTask extends TimerTask {
@Override
public void run() {
if(Lesson9DistributedTask.zk!=null){
try {
System.out.println(Lesson9DistributedTask.zkNode);
List<String> list = Lesson9DistributedTask.zk.getChildren("/task/timer", false);
String temp = null;
System.out.println(list);
for(String i : list){
if(temp!=null){
if(i.compareTo(temp)<0){
temp=i;
}
}
else {
temp=i;
}
}
if(temp.equals(Lesson9DistributedTask.zkNode)){
System.out.println("timer1 excute");
}
} catch (KeeperException e) {
e.printStackTrace();
return;
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
}
}

  在生产的实际使用过程中,按此方法实现的分布式定时任务运行的过程中,没有出现任何问题,此demo只是一个简单版的实现,如果需要在生产环境使用,还需要对zk的客户端进行监控。

lesson9:分布式定时任务的更多相关文章

  1. 基于spring+quartz的分布式定时任务框架

    问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比较快,因此,开发人员花费了更多的时间去更=跟上迭代的步伐,而缺乏了对整个系统的把控 没有集群之前 ...

  2. 分布式定时任务框架比较,spring batch, tbschedule jobserver

    分布式定时任务框架比较,spring batch, tbschedule jobserver | 移动开发参考书 分布式定时任务框架比较,spring batch, tbschedule jobser ...

  3. 分布式定时任务 -- elastic-job

    一.前言 在我们的项目当中,使用定时任务是避免不了的,我们在部署定时任务时,通常只部署一台机器.部署多台机器时,同一个任务会执行多次.比如短信提醒,每天定时的给用户下发短信,如果部署了多台,同一个用户 ...

  4. 分布式定时任务框架——python定时任务框架APScheduler扩展

    http://bbs.7boo.org/forum.php?mod=viewthread&tid=14546 如果将定时任务部署在一台服务器上,那么这个定时任务就是整个系统的单点,这台服务器出 ...

  5. 【xxl-job】轻松实现分布式定时任务demo实例

    [项目描述]前段时间专门独立了一个spring boot服务,用于做和第三方erp系统的对接工作.此服务的第一个需求工作就是可以通过不同的规则,设置不同的定时任务,从而获取erp系统的商品数据.所以, ...

  6. Elastic-Job - 分布式定时任务框架

    Elastic-Job - 分布式定时任务框架 摘要 Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范 ...

  7. 【redis】分布式锁实现,与分布式定时任务

    如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 写在前面 redis辣么多数据结构,这么多命令,具体一点,都可以应用在什么场景呢?用来解决什么具体的问 ...

  8. Java分布式定时任务

    分布式定时任务 elastic-job 可以实现任务分片 quartz 可以把任务存入数据库,实时生成任务(添加数据库添加定时任务) 文档 中文翻译 翻译2

  9. 3分钟掌握Quartz.net分布式定时任务的姿势

    引言 长话短说,今天聊一聊分布式定时任务,我的流水账笔记: ASP.NET Core+Quartz.Net实现web定时任务 AspNetCore结合Redis实践消息队列 细心朋友稍一分析,就知道还 ...

随机推荐

  1. css渐变色

    <!DOCTYPE html><html><head> <meta http-equiv="content-type" content=& ...

  2. java 类处理工具

    public class ClassUtils { private static final Logger LOGGER = LoggerFactory.getLogger(ClassUtils.cl ...

  3. ios 中的UI控件学习总结(1)

    UIKit框架提供了非常多功能强大又易用的UI控件 下面列举一些在开发中可能用得上的UI控件 UIButton 按钮 UILabel 文本标签 UITextField 文本输入框 UIImageVie ...

  4. Objective-C中的内存管理——手动内存管理

    一.引用计数(retainCount) 1.内存的申请 alloc和new是Objective-C语言中申请内存的两种常用方式. 当我们向一个类对象发送一个alloc消息的时候,其会向操作系统在堆中申 ...

  5. UIScrollView不能响应touch事件的解决办法

    UIScrollView本身事是不支持touch的,我们可以给她添加拓展 #import "UIScrollView+util.h" @implementation UIScrol ...

  6. thinkphp对文件的上传,删除,下载操作

    工作需要,整理一下最近对php的学习经验,希望能对自己有帮助或者能帮助那些需要帮助的人. thinkphp对文件的操作,相对来说比较简单,因为tp封装好了一个上传类Upload.class.php 废 ...

  7. 利用GDB在远程开发机进行调试

    由于一些环境的制约,很多同学都可能需要在开发机上进行调试,但由于开发机资源的限制,在开发机上直接进行本地的GDB环境配置就成了难题,这个时候其实我们可以利用GDB中自带的gdbserver工具就可以进 ...

  8. Java学习----运算符与表达式

    一.运算符 1.算术运算符 +   -   *   /  %  ++  -- public class Test7 { public static void main(String[] args) { ...

  9. Ubuntu16.04下编译vim with python support失败的原因

    - youcompleteme原话:On Ubuntu 16.04, Python support was not working due to enabling both Python2 and P ...

  10. C语言基础学习基本数据类型-浮点型

    float和double 加了小数点的数都是浮点数.C语言有两种书写浮点数的方式,一种是使用常用的标准小数点表示法,如下: 0.00056 8.0 1.23 第二种表示浮点值叫做E表示法.下面是一些例 ...