原文:http://stevex.blog.51cto.com/4300375/1351980
http://shmilyaw-hotmail-com.iteye.com/blog/2169047
http://jingyan.baidu.com/article/0f5fb099cc244d6d8234ea6b.html
Spring最大的能耐之一就是提供对流行框架的无缝集成,Quartz作为Java实现的工业标准级别的定时任务调度器,Spring对其提供了无缝的集成,并大大简化了开发工作,这是使用Spring比较爽的地方之一。
一个任务调度器最基本的三个元素是
-
Job(or Task):需要定时处理的事情
-
Trigger: 事件触发时间点(一次性的、固定周期性的、像Linux Cron Jobs 灵活配置的)
-
Scheduler: 调度器
Job与Trigger是一对一的关系,Scheduler与Trigger是一对多的关系。
先看一个Spring配置这三个元素的示例:
<!-- 定时加载的目标类 -->
<
bean
id
=
"fixedRateTask"
class
=
"com.stevex.demo.FixedRateTask"
></
bean
>
<
bean
id
=
"fixedTimeTask"
class
=
"com.stevex.demo.FixedTimeTask"
></
bean
>
<
bean
id
=
"job1"
class
=
"org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
>
<
property
name
=
"targetObject"
ref
=
"fixedRateTask"
>
</
property
>
<
property
name
=
"targetMethod"
value
=
"doSth"
></
property
>
</
bean
>
<
bean
id
=
"job2"
class
=
"org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
>
<
property
name
=
"targetObject"
ref
=
"fixedTimeTask"
>
</
property
>
<
property
name
=
"targetMethod"
value
=
"doSth"
></
property
>
</
bean
>
<
bean
id
=
"simpleTrigger"
class
=
"org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
>
<
property
name
=
"jobDetail"
ref
=
"job1"
/>
<
property
name
=
"startDelay"
value
=
"0"
/>
<!--单位毫秒 -->
<
property
name
=
"repeatInterval"
value
=
"60000"
/> <!--单位毫秒 -->
</
bean
>
<
bean
id
=
"cronTrigger"
class
=
"org.springframework.scheduling.quartz.CronTriggerFactoryBean"
>
<
property
name
=
"jobDetail"
ref
=
"job2"
/>
<
property
name
=
"cronExpression"
value
=
"0 2 15 * * ?"
/>
</
bean
>
<
bean
class
=
"org.springframework.scheduling.quartz.SchedulerFactoryBean"
>
<
property
name
=
"triggers"
>
<
list
>
<
ref
bean
=
"simpleTrigger"
/>
<
ref
bean
=
"cronTrigger"
/>
</
list
>
</
property
>
</
bean
>
Quartz的Job对应类为JobDetail,Spring为简化开发提供了工厂包装类MethodInvokingJobDetailFactoryBean类,当然开发人员还是可以自己实现JobDetail的,可以简单通过继承QuartzJobBean实现。
类MethodInvokingJobDetailFactoryBean类有concurrent属性默认值为true,即作业可并发调度,可以将其设置为false如果不允许作业被并发调度。
Quartz提供两种Trigger,一是SimpleTrigger提供周期性定时触发器,Spring的对工厂类为SimpleTriggerFactoryBean(注:SimpleTriggerBean不支持Quartz2以上版本,已经被SimpleTriggerFactoryBean替代);一是CronTrigger提供像Linux Cron Jobs那样的复杂触发器,触发时间点使用Cron表达式定义,Cron表达式语法可以参考Quartz官方文档,Spring的对应工厂类为CronTriggerFactoryBean(注:CronTriggerBean不支持Quartz2以上版本,已经被CronTriggerFactoryBean替代)。
Quartz的Scheduler对应类为Scheduler,Spring对应工厂类为SchedulerFactoryBean。
完整路径类名列表如下:
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
org.springframework.scheduling.quartz.QuartzJobBean
org.springframework.scheduling.quartz.SimpleTriggerFactoryBean
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerFactoryBean
org.springframework.scheduling.quartz.CronTriggerBean
org.springframework.scheduling.quartz.SchedulerFactoryBean
Spring同时提供对Quartz的TriggerListener和JobListener的支持,这类似AOP编程,可以在任务执行前后进行检查等工作,通过简单的属性配置可实现。
一个maven的工程,其类型依然是archetype-quickstart。唯一不同的地方在于我们引入更多spring的库,其pom.xml文件内容如下:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.0.0</version>
</dependency>
就可以试试了