Quartz Scheduler,定时任务
Quartz是一个作业调度系统(a job scheduling system),负责在约定的时间到达时执行(或通知)其他软件控制。是一个Java的定时任务框架,使用它可以方便的实现计划任务,即在某个时间或每隔一定时间运行一个任务。Quartz的核心是Job/JobDetail,Trigger和Scheduler。
1.Job/JobDetail
Job/JobDetail=既要执行的任务,可以通过实现Job(interface)中的excute方法来指定任务的具体操作。 他描述了一个任务具体的信息,比如名称,组名等等。JobDetail对象是在Quartz的客户端(我们的程序)在Job被关联加入到Scheduler时创建的,JobDetail包含了Job的各种属性值和 JobDataMap,JobDataMap中存放了与之相关的Job类实例的状态信息。
2.Trigger
用于控制一组Job的触发,包裹SimmperTrigger和CronTrigger,后者支持一种描述触发事件和间隔的表达式语言。Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:
1).你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
2).当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
3.Scheduler
控制和管理触发器的启动和终止。
使用Scheduler前必须实例化Scheduler,需要由SchedulerFactory类来创建Scheduler,Factory的实例可以通过在JNDI存储中的Factory的序列化的方式获取,实例化Factory后直接使用该实例很容易。
例子:
1.基础配置
1 org.quartz.scheduler.instanceName = MyScheduler
2 org.quartz.threadPool.threadCount = 3
3 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.scheduler.instanceName - This scheduler’s name will be “MyScheduler”.
org.quartz.threadPool.threadCount - There are 3 threads in the thread pool, which means that a maximum of 3 jobs can be run simultaneously.
org.quartz.jobStore.class - All of Quartz’s data, such as details of jobs and triggers, is held in memory (rather than in a database)
2.实例化scheduler,并启动和关闭
1 import org.quartz.Scheduler;
2 import org.quartz.SchedulerException;
3 import org.quartz.impl.StdSchedulerFactory;
4 import static org.quartz.JobBuilder.*;
5 import static org.quartz.TriggerBuilder.*;
6 import static org.quartz.SimpleScheduleBuilder.*;
7
8 public class QuartzTest {
9
10 public static void main(String[] args) {
11
12 try {
13 // Grab the Scheduler instance from the Factory
14 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
15
16 // and start it off
17 scheduler.start();
18
19 scheduler.shutdown();
20
21 } catch (SchedulerException se) {
22 se.printStackTrace();
23 }
24 }
25 }
3.定义自己的Job
1 public class HelloJob implements org.quartz.Job {
2
3 public HelloJob () {
4 }
5
6 public void execute(JobExecutionContext context) throws JobExecutionException {
7 System.err.println("Hello World! HelloJob is executing.");
8 }
9 }
4.在scheduler启动和关闭之间执行Job
1 // define the job and tie it to our HelloJob class
2 JobDetail job = newJob(HelloJob.class)
3 .withIdentity("job1", "group1")
4 .build();
5
6 // Trigger the job to run now, and then repeat every 40 seconds
7 Trigger trigger = newTrigger()
8 .withIdentity("trigger1", "group1")
9 .startNow()
10 .withSchedule(simpleSchedule()
11 .withIntervalInSeconds(40)
12 .repeatForever())
13 .build();
14
15 // Tell quartz to schedule the job using our trigger
16 scheduler.scheduleJob(job, trigger);