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);