Quartz基本概念

来源:互联网 发布:php文件怎么用打开手机 编辑:程序博客网 时间:2024/06/14 09:56

参考:http://geniuszhe.blog.163.com/blog/static/119346820141142437889/


Quartz是一个超级强大的任务调度框架,基本上每一个java开发者都会用到它。

首先来看一下Quartz中的一些基本概念,其中三个核心的概念是调度器(Scheduler)任务(Job)触发器(Trigger)

一、核心概念

(1)任务 Job和JobDetail

Job是一个接口,其中只有一个方法:void execute(JobExecutionContext context)。一个Job就代表一个任务,你要定义一个任务就要实现一个Job,任务的具体内容就实现在execute方法中。JobExecutionContext 提供了任务调度上下文信息。

Quartz在每次执行Job时,都会重新创建一个Job实例,因此它不直接接受一个Job实例,而是通过JobDetail,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。

每个JobDetail都有一个JobKey和它关联,JobKey唯一标识一个JobDetail,由name和group组成,通过JobDetail的getKey方法可以返回这个JobKey。我理解的是JobKey是用来唯一标识一个JobDetail的,调度器触发、停止、删除一个任务都是通过JobKey的,例如 triggerJob(jobKey) 、pauseJob(jobKey)、 deleteJob(jobKey)。


(2)触发器 Trigger

Trigger是一个接口,描述触发Job执行的时间规则。主要有SimpleTrigger和 CronTrigger这两个子接口。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则 可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等。

可以用TriggerBuilder实例化一个Trigger。

每个Trigger都有一个TriggerKey和它关联,TriggerKey唯一标识一个Trigger,由name和group组成,通过Trigger的getKey方法可以返回这个TriggerKey。TriggerKey用来唯一标识一个Trigger,比如从调度器中获取一个Trigger:scheduler.getTrigger(triggerKey)。


(3)调度器 Scheduler

Scheduler是一个接口,代表一个Quartz的独立运行容器。JobDetail和Trigger成对地注册到Scheduler中,一旦注册上后,Scheduler负责当Trigger触发后执行相应的Job。通过SchedulerFactory创建Scheduler,并且在使用前必须调用start方法,如:

  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();  scheduler.start();

Scheduler 提供了一系列对任务进行调度的方法,如触发、停止、重新开始等。

一个Job可以对应多个Trigger,但是一个Trigger只能对应一个Job。Scheduler拥有一个SchedulerContext,它类似于 ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。 可以通过Scheduler的getContext()方法获取对应的SchedulerContext实例。


二、其它概念

(1)JobDataMap

JobDataMap保存Job的状态信息。Trigger也可以拥有一个JobDataMap,这样当一个job关联多个trigger时,就可以分别对应不同的trigger,job分别有一个独立的JobDataMap。JobExecutionContext有个getMergedJobDataMap方法,它返回的一个JobDataMap是这个job和它的trigger的JobDataMap的并集,如果map中有同名的key的话,后者会覆盖前者。


(2)@DisallowConcurrentExecution

这个注解加在实现Job的类上,禁止并发执行多个相同定义的JobDetail。




0 0
原创粉丝点击