Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。读者可以到 http://www.quartz-scheduler.org/站点下载 Quartz 的发布版本及其源代码。
Quartz优点是:
1、能嵌入到任何独立的应用中运行
2、能在应用服务器或者Servlet 容器中实例化,并且能够参与XA事务。
3、能够以独立的方式运行(在它自己的Java 虚拟机中),可以通过RMI 使用Quartz。
4、可以被实例化为独立程序的集群(有负载均衡和容错能力)。
Quartz 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任务调度的元数据, scheduler 是实际执行调度的控制器。
Scheduler:任务调度器,是实际执行任务调度的控制器。在spring中通过SchedulerFactoryBean封装起来。
Trigger:触发器,用于定义任务调度的时间规则,有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比较多,本文主要介绍这种方式。CronTrigger在spring中封装在CronTriggerFactoryBean中。
job 用于表示被调度的任务。主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。Job 主要有两种属性:volatility 和 durability,其中 volatility 表示任务是否被持久化到数据库存储,而 durability 表示在没有 trigger 关联的时候任务是否被保留。两者都是在值为 true 的时候任务被持久化或保留。一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job。
一、配置xml
<!-- 定时任务 start -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!--被调度的任务-->
<property name="jobClass" value="com.css.job.QueryJob"></property>
<!--durability 表示在没有 trigger 关联的时候任务是否被保留-->
<property name="durability" value="true" />
</bean>
<!--用于定义任务调度的时间规则-->
<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"></property>
<property name="cronExpression" value="0 */2 * * * ? "></property>
</bean>
<!--执行调度的控制器。-->
<bean id="trigger" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
二、用法说明
第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean。
public class QueryJob extends QuartzJobBean {
/**
* 要调度的具体任务
*/
public void query() {
new dController().data(mapper);
}
/**
* executeInternal方法这个方法是在时间到来时自动执行的方法,
* 在executeInternal(JobExecutionContext)方法中书写自己想要执行的方法体。
*/
@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
query();
}
}