目录
Quartz 简介
Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域的又一个开源项目,完全用 Java 开发,它是一个功能丰富、开放源码的作业调度框架,可以用于 J2SE 和 J2EE 应用程序,从最小的独立应用程序到规模最大的电子商务系统都可以使用 Quartz 。Quartz 可以创建简单或复杂的日程,安排执行十几、几百甚至上万的作业,作业被定义为标准的 Java 组件,可以通过编程让它们执行几乎任何程序。
Quartz 功能
Quartz 具有强大的调度功能,包括许多企业级功能,如 JTA 事务和集群支持;很容易与 Spring 集成,实现灵活可配置的调度功能;提供了调度运行环境的持久化机制;具有灵活的应用方式,允许开发者灵活地定义触发器的调度时间表并可以为触发器和任务进行关联映射。
Quartz 核心要素
Quartz 有3个核心要素,即任务(Job)、触发器(Trigger)、调度器(Scheduler),它们之间的关系可以如下理解。
首先要有一个定时执行任务,描述具体的业务逻辑,如定时发送邮件的任务、重启机器的任务、优惠券到期发送短信提醒的任务等。
其次需要一个触发任务去执行的触发器,触发器最基本的功能是指定任务的执行时间、时间间隔、运行次数等。
最后通过调度器将任务和触发器结合起来,即指定触发器去执行指定的任务。调度器是整个框架的心脏和灵魂。
下面我们来简单介绍一下 Quartz 的三个核心要素。
1.Job
Job 是 Quartz 的任务,其解控比较简单,是完成业务逻辑的任务组件需要实现的接口,其中只有一个方法,即 execute(JobExecutionContext context),开发者通过该接口定义任务,在这个方法中编写业务逻辑。
2.Trigger
Trigger 是 Quartz 的触发器,会通知 Scheduler 何时去执行对应 Job。Trigger 是一个类,描述了触发 Job 执行的时间触发规则,当准备调度一个 Job 时,创建一个 Trigger 的实例,然后设置调度相关的属性即可。
3.Scheduler
Scheduler 是 Quartz 的调度器,它代表 Quartz 的一个独立运行的容器,维护着 Quartz 的各种组件并实施调度的规则。
注意:一个 Job 可以对应多个 Trigger ,但一个 Trigger 只能对应一个 Job。
设置执行任务
以下我们将使用 Spring Boot 整合 Quartz,设置一个执行任务。
我将从如何新建项目开始说起,如果大家这几步已经会了可以跳过。
a.新建项目,点击New Poject
因为我学的是Spring Boot,所以是根据自己的需求所选择的哈。
因为电脑和版本的原因我选择了最低的版本。
b.添加依赖。
(创建完成后大家记得配置Maven,我就总是因为忘记配置而报错,所以大家不要忘记哦!不知道如何安装和配置的可以点击这里进行查看,这位博主介绍的很详细哦。)
c.依次新建包和类即可。
d.如果报错了大家不要慌,根据下图导入类即可,导入完成后就不会报错啦!
最终的运行结果如下图:
代码大家根据下面的写入即可。
1.创建项目,引入依赖。
创建项目 curit7-1,除了基本依赖外,在 pom.xml文件中引用 Quartz 依赖,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.创建任务类。
在项目中创建包 cn.js.jobs,在包中创建任务类 HelloJob ,代码如下:
/**
*创建任务类,描述需要定时执行的具体业务逻辑
*/
public class HelloJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//获取 JobDetail 对象
JobDetail jobDetail=context.getJobDetail();
//获取 JobDatamap 对象
JobDataMap jobDataMap=jobDetail.getJobDataMap();
String username=(String) jobDetail.getJobDataMap().get("username");
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
System.out.println(jobDataMap.get("depart")+"------"+jobDataMap.get("username")+"现在时间是:"+ sf.format(new Date())+",新的一周开始了!");
}
}
这里在 execute 方法中先获取 JobDetail 对象,再获取 JobDataMap 对象,通过 JobDataMap 对象获取其中存储的用户名和部门数据,输出欢迎语。
3.创建调度类。
创建 cn.js.quartz,在包中创建调度类 TriggerRunner,代码如下:
public class TriggerRunner {
public static void main(String[] args) throws SchedulerException {
//JobDetail:用来绑定Job,并且 Job 执行的时候携带一些执行的信息。
//创建一个 JobDetail 实例,将该实例与 HelloJob 类绑定。
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob","group1") //指定 Job 的名字
.usingJobData("username","李四") //存储用户名
.build();
//存储数据
JobDataMap jobDataMap=jobDetail.getJobDataMap();
jobDataMap.put("depart","销售部");
//Trigger:用来触发 Job 去执行,定义了什么时候去执行、什么时候第一次执行、
//是否会一直重复地执行下去、执行几次等;
//创建一个 Trigger 实例,定义该 Job 立即执行,并且每个2s重复执行一次,重复3次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger","group1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 7 ? * MON"))
//使用 CronSchedule. 每周一上午7点触发
.build();
//创建 Scheduler 实例:Scheduler 实例区别于 Trigger 实例和 JobDetail 实例,
//是通过 factory 模式创建的。
//创建 ScheduleFactory
SchedulerFactory schedulerFactory = new StdSchedulerFactoey();
//创建 Scheduler
Scheduler scheduler = schedulerFactory.getScheduler();
//注入 JobDetail 和 Trigger 到 Scheduler 中
scheduler.scheduleJob(jobDetail,trigger);
//开始调度
scheduler.start();
}
}
在调度类TriggerRunner 中,先创建 JobDetail 实例,绑定 Job 实例,并存储数据,再创建 Trigger 实例,设置触发策略,最后创建 Scheduler 实例,讲Job实例和 Trigger 实例绑定注入,启动调度即可,这样就使用Quartz 实现了一个简单的定时任务。
Quartz 还可以将任务调度信息持久化到数据库中,以便系统重启时能够恢复已经安排的任务。Quartz 还支持 JTA 事务和集群。
以上有任何不正确的地方欢迎大家指出!