在做项目的时候,有时候会用到定时任务.虽然Java自身提供了定时任务的功能,但是在实际的项目开发中,一般都会使用到Quartz这个框架. Quartz 在开源任务调度框架中的首屈一指.不仅是因为其提供了强大的调度机制,而且使用起来也特别简洁.当然Spring 也集成了Quartz,这位我们的开发带来了很大的方便.
网上有很多关于Quartz 的文章,进过一段时间的学习和工作中项目的实战,总结了这个系列的文章.
阅读前须知: 1. Quartz1 和Quartz2有比较大的区别,本系列是采用的是此时最新的版本 quartz2.2.3 ;2.在后后期的文章中做了 spring3.2.9+quartz2.2.3 的整合 3.本系列文章中所有的项目都是经过测试的,而且源码可下载. 源码下载地址 4.在学习的过程中,参考了《Quartz Job Scheduling Framework》,这本书讲的很详细,但遗憾的是没有讲解与Spring 的整合,与Spring的整合参考了Spring的文档
1 几个核心的概念(重要的有标记)
Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中;()
JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。通过该类的构造函数可以更具体地了解它的功用:JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称;()
Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger(常用且重要)这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;(*)
Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例;(*)
概念总是枯燥的.要想理解上面几个核心概念,通过具体的例子是一个很好的办法.
1.创建一个项目,可以普通的项目,也可以是web项目,这里我创建了web项目. 包含如下jar包.
2.创建一个实现了org.quartz.Job 接口的类
package com.quartz.job;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
//实现了job接口的Q1 job
public class Q1 implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("------------------------");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss");
System.out.println(sdf.format(new Date()));
// 获取jobDetail 中的参数
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
String para1 = jobDataMap.getString("para1");
System.out.println("jobDataMap中的para1:" + para1);
System.out.println("------------------------");
}
}
3.创建调度
package com.quartz.test;
import org.apache.log4j.Logger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.quartz.job.Q1;
public class SimpleScheduler {
Logger logger = Logger.getLogger(SimpleScheduler.class);
public void startScheduler() {
try {
// 创建Q1的一个jobDetail,传入Q1.class;job_1(任务名),jGroup1(任务组)
JobDetail jobDetail = JobBuilder.newJob(Q1.class).withIdentity("job_1", "jGroup1").build();
// 可以向jobDetail 中设置参数,这些参数在Q1的execute方法中获取到
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("para1", "hello,Quartz!");
// 5秒执行一次trogger_1(触发器名) ,tGroup1(触发器组名)
SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)
.repeatForever();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trogger_1", "tGroup1").startNow()
.withSchedule(builder).build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// scheduler 装载jobDetail 和 trigger
scheduler.scheduleJob(jobDetail, trigger);
// 启动 scheduler
scheduler.start();
} catch (SchedulerException e) {
logger.error(e);
}
}
public static void main(String[] args) {
SimpleScheduler ss = new SimpleScheduler();
ss.startScheduler();
}
}
一个简单的定时任务就完成了.运行结果:
本文介绍一下Quartz的几个核心概念,并创建了第一个的Quartz 入门项目.下一章我们来学习JobDetail 和两种不同的Trigger.
下一章节地址Quartz(02) 两种Trigger(SimpleTrigger/CronTrigger)
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/china_shrimp/article/details/52133050
内容来源于网络,如有侵权,请联系作者删除!