概述

上一篇文章完成了第一个Quartz程序的编写,这篇从Quartz中的几个重要对象来更深一层认识Quartz框架。

Job和JobDetail

Job是Quartz中的一个接口,接口下只有execute方法,在这个方法中编写业务逻辑。

该接口的源码:

package org.quartz;

public interface Job {
void execute(JobExecutionContext var1) throws JobExecutionException;
}

每次调度执行Job时,调用execute方法前会创建一个新的Job实例,执行完后,关联的Job对象实例会被释放,随后jvm执行GC。

JobDetail是用来绑定Job,为Job实例提供了许多属性,以及JobDataMap成员变量属性。调度器scheduler通过JobDetail对象来添加Job实例。

属性:

1.    name

2.    group

3.    jobClass

4.    jobDataMap

JobExecutionContext

当调度器Scheduler调用一个Job时,就会将JobExecutionContext传递给Job的execute()方法,Job能通过JobExecutionContext对象访问到Quartz运行时的环境以及Job本身的详细数据信息。

代码演示:

public class HelloWorldJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
System.out.println( strTime + ":Hello World!");
System.out.println("JobDetail'name:" + jobExecutionContext.getJobDetail().getKey().getName());
System.out.println("JobDetail'group:" + jobExecutionContext.getJobDetail().getKey().getGroup());
System.out.println("JobDetail'class:" + jobExecutionContext.getJobDetail().getClass());
}
}

JobDataMap

任务调度时可以通过JobExecutionContext获取JobDataMap,可以装在任何可序列化的数据对象,JobDataMap实现了JDK的Map接口,可以以Key-Value的形式存储数据。

实战:JobDetail和Trigger传递数据,HelloWorldJob类execute三种方式获取数据。

//创建JobDetail实例,并与HelloWordlJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
.usingJobData("key1","this is jobDetail")
.build(); //创建触发器Trigger实例(立即执行,每隔1S执行一次)
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "triggerGroup1")
.usingJobData("key2", "this is trigger")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();

HelloWorldJob获取数据:

public class HelloWorldJob implements Job {
private String key1;
private String key2; public String getKey1() {
return key1;
} public void setKey1(String key1) {
this.key1 = key1;
} public String getKey2() {
return key2;
} public void setKey2(String key2) {
this.key2 = key2;
} @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
System.out.println( strTime + ":Hello World!"); //获取DataMap数据方法一
System.out.println("JobDetail JobDataMap:" + jobExecutionContext.getJobDetail().getJobDataMap().get("key1"));
System.out.println("Trigger JobDataMap:" + jobExecutionContext.getTrigger().getJobDataMap().get("key2")); //获取DataMap数据方法二
System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key1"));
System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key2")); //获取数据方法三
System.out.println("通过成员变量获取" + key1);
System.out.println("通过成员变量获取" + key2);
}
}

Trigger

Trigger是Quartz中的触发器,任务执行时会通知调度器Scheduler何时出发,几个重要的属性。

1.    Jobkey:表示job实例的标识

2.    StartTime:表示触发器首次被触发的时间(Java.util.Date)。

3.    EndTime:表示触发器结束触发的时间(Java.util.Date)

实战:实现5S后执行,10S后结束,期间每隔1S执行一次定时任务

代码演示:

MyScheduler类

public class MyScheduler {

    public static void main(String[] args) throws SchedulerException {
//创建调度器Schedule
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler(); //创建JobDetail实例,并与HelloWordlJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
.build(); //创建触发器Trigger实例(5S后执行,10S后结束)
//开始时间(5S后)
Date date1 = new Date();
date1.setTime(date1.getTime() + 5000); //结束时间(10S后)
Date date2 = new Date();
date2.setTime(date2.getTime() + 10000); Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "triggerGroup1")
.startAt(date1)
.endAt(date2)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build(); //开始执行
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
}

SimpleTrigger

SimpleTrigger可以实现在一个指定时间段内执行一次作业任务或一个时间段内多次执行作业任务。

实战:5S后开始执行,间隔时间为1S,第一次执行后连续执行3次

package quartz2;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory; import java.util.Date; /**
* created by Java-Road
* created in 2018/5/27
*/
public class MyScheduler2 { public static void main(String[] args) throws SchedulerException {
//创建调度器Schedule
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler(); //创建JobDetail实例,并与HelloWordlJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
.build(); //创建触发器Trigger实例(5S后执行,一直执行)
//开始时间(5S后)
Date date1 = new Date();
date1.setTime(date1.getTime() + 5000); SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("trigger1", "triggerGroup1")
.startAt(date1)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
.withRepeatCount(3))
.build(); //开始执行
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
}

CronTrigger

CronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基于Cron表达式的,先了解下Cron表达式:

由7个子表达式组成字符串的,格式如下:

[秒] [分] [小时] [日] [月] [周] [年]

Cron表达式的语法就不多说了,因为我也记不住只能度娘,给大家提供个在线生成Cron表达式的工具:http://cron.qqe2.com/

实战:实现每周一到周五上午10:30执行定时任务

package quartz2;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory; import java.util.Date; /**
* created by Java-Road
* created in 2018/5/27
*/
public class MyScheduler3 { public static void main(String[] args) throws SchedulerException {
//创建调度器Schedule
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler(); //创建JobDetail实例,并与HelloWordlJob类绑定
JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
.build(); //创建触发器CronTrigger实例(每周一到周五10:30执行任务)
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("trigger1", "triggerGroup1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * MON-FRI *"))
.build(); //开始执行
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
}

讨论群:611262656,一键加群:点击加群

更多技术文章请关注微信公众号“Java架构师之路”:

开源定时任务框架Quartz(二)的更多相关文章

  1. 开源定时任务框架Quartz(一)

    简介 Quartz是OpenSymphony开源组织的一个开源项目,定时任务框架,纯Java语言实现,最新版本为2.3.0. 设计模式 Quartz中使用的设计模式如下: 1.Builder模式 2. ...

  2. 震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……

    过场CG:   接到公司领导的文件指示,“小熊”需要在6月底去海外执行一个行动代号为[定时任务]的营救计划,这个计划关系到公司某个项目的生死(数据安全漏洞),作战部拟定两个作战方案: 方案一:使用务定 ...

  3. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

  4. 开源调度框架Quartz最佳实践

    开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...

  5. .NET开源作业调度框架(Quartz.NET和FluentScheduler)实战项目演练

    一.课程介绍 明人不说暗话,跟着阿笨一起玩NET .本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享 ...

  6. Quartz.NET开源作业调度框架系列(二):CronTrigger

    CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...

  7. Quartz.NET开源作业调度框架系列(二):CronTrigger-转

    CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...

  8. .Net平台开源作业调度框架Quartz.Net

    Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...

  9. (转).Net平台开源作业调度框架Quartz.Net

    Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...

随机推荐

  1. Codeforces - 2019年11月补题汇总

    大概目标是补到 #500 为止的 Div. 2 ,先定个小目标,寒假开始前补到 #560 为止 Codeforces Round #599 (Div. 2) 5/6 备注:0-1BFS(补图连通块) ...

  2. chtMultiRegionSimpleFoam求解器的热源不在边界上【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-solving/126777-chtmultiregionsimplefoa ...

  3. ICEM-带死角弯管

    原视频下载地址:https://yunpan.cn/cqRiHaQiLi8I7  访问密码 b5c6

  4. Lucene4.2源码解析之fdt和fdx文件的读写(续)——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压

    2       索引读取阶段 当希望通过一个DocId得到Doc的全部内容,那么就需要对fdx/fdt文件进行读操作了.具体的代码在CompressingStoredFieldsReader类里面.与 ...

  5. IO流——常用IO流详解

    1:字节流 字节流:用于处理以字节为单位的二进制文件(如音乐,图片等) InputStream 是抽象类 它的对应子类FileInputStream可以被实例化 构造方法: FileInputStre ...

  6. Co-Clustering_Reproducing

    调包一时爽,复现马上躺. Co-Clustering 注意右上角的:"Edit on GitHub",一开始疯狂吐槽没有源码,复现得非常难受,今天刚做完GM05中Algotirhm ...

  7. Matrix: android 中的Matrix (android.graphics.Matrix) (转)

    本篇博客主要讲解一下如何处理对一个Bitmap对象进行处理,包括:缩放.旋转.位移.倾斜等.在最后将以一个简单的Demo来演示图片特效的变换. 1. Matrix概述 对于一个图片变换的处理,需要Ma ...

  8. MindManager2018试用期过后 修改过期时间 破解使用

    MindManager2018试用期过后 修改过期时间 破解使用 2019年06月13日 15:58:11 一生中所爱 阅读数 1991更多 分类专栏: 工具软件使用   1.找到路径:C:\User ...

  9. Java开发中使用sort排序

    Java开发中使用sort排序 BaiduSpring https://baijiahao.baidu.com/s?id=1625440912158830354&wfr=spider& ...

  10. Android:Mstar平台 HDMI OUT 静音流程

    一.framework层 1. APP调用 AudioManager 的 adjustStreamVolume() 接口实现在: frameworks\base\services\core\java\ ...