概述

上一篇文章完成了第一个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. 在docker容器中编译hadoop 3.1.0

    在docker容器中编译hadoop 3.1.0 优点:docker安装好之后可以一键部署编译环境,不用担心各种库不兼容等问题,编译失败率低. Hadoop 3.1.0 的源代码目录下有一个 `sta ...

  2. /dev/mem同步写不能使用msync的MS_SYNC选项探究

    问题 做了个测试板子的程序,里面有一项写铁电的功能,要求写入之后立即断电,重启后校验数据准确性:铁电设计是通过内存地址直接映射的,于是,使用mmap直接映射了/dev/mem文件,自然地写入之后使用m ...

  3. CSRF in asp.net mvc and ap.net core

    如果在方法上添加了[ValidateAntiForgeryToken],没处理好 请求没有带参数 2019-09-17 14:02:45,142 ERROR [36]: System.Web.Mvc. ...

  4. Android:系统自定义鼠标样式切换

    一.APP通过View修改鼠标样式 app view上修改鼠标样式比较简单,通过 hover event 获取鼠标坐标并使用如下方法修改为自定义图片: getWindow().getDecorView ...

  5. Spring Bootz之热部署

    在项目的pom.xml文件添加如下两段 <dependency> <groupId>org.springframework.boot</groupId> <a ...

  6. Syste类

    System类的概述 System 类包含一些有用的类字段和方法.它不能被实例化. 成员方法 public static void gc()  运行垃圾回收器. public static void ...

  7. osg::PagedLOD example

    int main() { osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; osg::ref_ptr< ...

  8. 26Flutter 日期 和时间戳/格式化日期库/flutter异步/ 官方自带日期组件showDatePicker、时间组件showTimePicker以及国际化

    /* 一.Flutter日期和时间戳 日期转换成时间戳 var now=newDateTime.now(); print(now.millisecondsSinceEpoch); //单位毫秒,13位 ...

  9. 阶段5 3.微服务项目【学成在线】_day18 用户授权_01-用户授权业务流程分析

    1 用户授权业务流程 用户授权的业务流程如下: 业务流程说明如下: 1.用户认证通过,认证服务向浏览器cookie写入token( 身份令牌) 2.前端携带token请求用户中心服务获取jwt令牌 前 ...

  10. python基础之面向对象(二)

    一点提醒 首先在使用pickle读取load时,需要先把使用到的类import上,否则会报错.在pycharm中使用时不会报错,但在linux或者cmd时就会报错!必须import. 报错提示: Fi ...