Java定时任务调度工具详解

本篇内容:
什么是定时任务调度?
Java定时任务调度工具详解之 Timer篇
Java定时任务调度工具详解之 Quartz篇

定时任务调度:基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行任务。

Java中定时调度工具:Timer 和 Quartz的区别

1.来源:
Timer由JDK自带,不需要引入多余的jar支持。Quartz需要引入jar包。
2.能力:Quartz时间控制更强大,完善。
3.Timer只有一个后台线程执行任务,Quartz拥有后台执行线程池能够使用多个线程执行任务.
能用 Timer 处理的时候,尽量用 Timer 处理。因为 Quartz 需要的资源更多(写法也不一样)。

ps:Quartz功能比Timer更牛逼,能用Timer就别让Quartz登场, 因为出场费很贵的。

Java定时任务调度工具详解之Timer篇

Timer的定义:有且仅有一个后台线程对多个业务线程进行定时定频率的调度
Timer主要构件:Timer定时器 TimerTask定时任务
通过 timer.schedule(myTimerTask, 2000L, 1000L) ,来定时调度

image.png

Timer的定时调度函数

image.png

Schedule 和 ScheduleAtFixedRate 区别:
Schedule,ScheduleAtFixedRate具有同步并发性。
1.schedule不具有并发性。下一次执行时间是相对于上一次任务结束的时间点。因此存在时间延后,不存在并发性。
2.scheduleAtFixedRate同步并发性。下一次执行时间是相对于上一次执行任务的开始时间点。为了赶上进度。因此执行时间一般不会延误,因此存在并发性。

timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情      
况出现时会有区别--当前任务没有来得及完成下次任务又交到手上。

定时任务的执行周期是2s一次,但任务执行需要3s。
此时,schedule 会在第一次任务执行之后,也就是3s之后执行任务。
但是,scheduleAtFixedRate会在第一次执行的2s之后,第二次执行定时任务。

我们来举个例子:
暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业。
老师要求学生暑假每天写2页,30天后完成作业。
这两个学生每天按时完成作业,直到第10天,出了意外,两个学生出去旅游花了5天时间,这5天时间里两个人都没有做作业。任务被拖延了。

这时候两个学生采取的策略就不同了:
schedule重新安排了任务时间,旅游回来的第一天做第11天的任务,第二天做第12天的任务,最后完成任务花了35天。

scheduleAtFixedRate是个守时的学生,她总想按时完成老师的任务,于是在旅游回来的第一天把之前5天欠下的任务以及第16天当天的任务全部完成了,之后还是按照老师的原安排完成作业,最后完成任务花了30天。

import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

public class Test01 {
public static void main(String[] args) {
    final Timer timer = new Timer();
    //timer.scheduleAtFixedRate(new TimerTask() {
    timer.schedule(new TimerTask() {//分别注释这行和上面这行试一试效果
        int count = 1;
        @Override
        public void run() {
            count++;
            if (count  == 10) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    System.out.println("延迟5s");
                    e.printStackTrace();
                }
            }
            SimpleDateFormat sf = new SimpleDateFormat(
                    "yyyy MM dd hh:mm:ss");
            System.out.println("当前时间:"
                    + sf.format(System.currentTimeMillis()) + "计划时间:"
                    + sf.format(scheduledExecutionTime()));
        }
    }, 1000, 1000);
  }
}

Timer的缺陷:
1.管理并发任务的缺陷:每次有且仅有一个线程去执行定时任务,如存在多任务会导致任务时间过长(串行)
2.当任务抛出异常时的缺陷:当抛出RuntimeException(如果不捕捉异常),会停止所有任务
3.在以下情况禁止使用
对时效性要求较高的多任务并发作业/对复杂的任务的调度

Java定时任务调度工具详解之 Quartz篇

Quartz特点:
1.强大的调度功能
2.灵活的应用方式
3.分布式和集群能力

三个核心:Jobdetail(调度器),Trigger(触发器) ,Scheduler (任务),就能轻松使用Quartz;
JobDetail用来绑定Job,并且在Job执行的时候携带一些执行的信息;
JobDetail和Tigger通过Builder模式创建;
Scheduler通过Factory模式创建;

image.png
public static void main(String[] args) throws SchedulerException, InterruptedException {
    // 打印当前的时间,格式为2017-01-01 00:00:00
    Date date = new Date();
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println("Current Time Is : " + sf.format(date));
    // 创建一个JobDetail实例,将该实例与HelloJob Class绑定
    JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
            .withIdentity("myJob").build();
    CronTrigger trigger = (CronTrigger) TriggerBuilder
            .newTrigger()
            .withIdentity("myTrigger", "group1")
            .withSchedule(
                    CronScheduleBuilder.cronSchedule("* * * * * ?"))
            .build();
    // 创建Scheduler实例
    SchedulerFactory sfact = new StdSchedulerFactory();
    Scheduler scheduler = sfact.getScheduler();
    scheduler.start();
    System.out.println("scheduled time is :"
            + sf.format(scheduler.scheduleJob(jobDetail, trigger)));
    //scheduler执行两秒后挂起
    Thread.sleep(2000L);        
    //shutdown(true)表示等待所有正在执行的job执行完毕之后,再关闭scheduler
    //shutdown(false)即shutdown()表示直接关闭scheduler
    scheduler.shutdown(false);
    System.out.println("scheduler is shut down? " + scheduler.isShutdown());
}

一.浅谈Job&JobDetail

image.png

JobDetail为Job提供的重要属性

可以通过 jobDetail 的 getKey() 方法来获取相关信息
jobDetail.getKey().getName();    // 获取名称
jobDetail.getKey().getGroup();    // 获取组名称
jobDetail.getJobClass.getName()    // 获取Job class 的名称
jobDataMap //用来存储特定Job实例的状态信息。

二.JobExecutionContext & JobDataMap

JobExecutionContext
概念:Job能通过JobExecutionContext访问Quartz运行环境以及Job的明细数据,当Scheduler调用Job时能将数据传递给execute()方法

JobDataMap
概念:是一个JDK中Map接口实例,在任务调度时存在于JobExecutionContext中,可将参数对象传递给在运行的Job实例;而且,它自身有方便的方法可存取基本数据类型
获取方式:从JobDataMap中直接获取、在Job实现类中添加setter方法对应JobDataMap的键值

未完待续~~~

https://www.imooc.com/video/15144

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。本文由浅入深介绍四种任务调度的 Jav...
    Java高级架构狮阅读 537评论 0 2
  • 前言 在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说...
    高级java架构师阅读 468评论 0 3
  • 前言 在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说...
    java温小馨阅读 510评论 0 2
  • 前言 在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说...
    张丰哲阅读 29,779评论 15 57
  • 消失在别人的视野里,在一个人的世界里浮沉。某一天,这种沉闷安静被打破。一位许久不见的同学发来微信,说在图书馆遇到...
    简宁W阅读 929评论 0 3