quartz是石英钟的意思,所以用这个名字来做定时器的框架名称再适合不过。一年前做项目的时候有用过这个框架,当时没有整理,今天刚好新的商城系统也需要定时器。想要达到的效果是:每天的固定时间,比如凌晨3:00的时候定时扫描数据库,查看所有的订单,看看这些订单是否超过5天还未付款,如果未付款,则将这部分未付款的订单的状态置为取消(或者说放入垃圾回收站)。功能很清晰简单,以下是具体的做法。
第一步,导包。因为是第三方的框架,自然要导包,导入quartz的jar包,这里导入的是quartz-2.2.1.jar这个版本,将其放入到web-inf下的lib中。
第二步,配置。
项目采用的是SSH框架,最好新建一个spring的配置文件,我给他起名为:quartzSping.xml。如图所示。
记得将这个配置文件引入到主的配置文件applicationContext.xml中,如图所示。仅需在applicationContext.cml的最后加入这样一句话就可以。
接下来就是配置quartzSpring.xml这个文件了。
1.首先,我们先新建一个java类,这个类中的代码将作为定时器触发时所要执行的代码。新建一个RealOrderQuart.java类。如下所示。
package wonyen.yipin.action;
import wonyen.yipin.service.RealOrderService;
public class RealOrderQuartz {
/**
* 订单定时扫描,判断是否满足取消条件
*/
private RealOrderService realOrderService;
public RealOrderService getRealOrderService() {
return realOrderService;
}
public void setRealOrderService(RealOrderService realOrderService) {
this.realOrderService = realOrderService;
}
public void orderQuartz() {
//此处编写定时器触发时候执行的代码
}
}
2.先配置刚才新建的那个java类,如下所示。
<!-- 订单扫描类 -->
<bean id="realOrderQuartz" class="wonyen.yipin.action.RealOrderQuartz"
scope="prototype">
<property name="realOrderService" ref="realOrderService" />
</bean>
3.配置quartz的任务具体信息,即MethodInvokingJobDetailFactoryBean,任务详情的工厂。
<!-- quartz任务详情工厂 -->
<bean id="realOrderQuartzJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="realOrderQuartz" />
</property>
<property name="targetMethod"> <!-- 要执行的方法名称 -->
<value>orderQuartz</value>
</property>
</bean>
4.配置定时规则触发器,配置定时触发规则有两种不同的实现类,一种是org.springframework.scheduling.quartz.SimpleTriggerBean,另外一种是org.springframework.scheduling.quartz.CronTriggerBean。区别在于前者只能做简单的定时,比如每隔多久触发一次,而后者可以使用cron表达式来自定义定时的规则。这边我采用后者。配置了从周一到周日,每天的3点20触发。cron表达式的具体用法可自行百度。这边的jobDetail属性填写上一步配置的任务详情,即realOrderQuartzJobDetail。
<!-- 配置定时规则,Cron表达式 ,调度触发器 -->
<bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
id="cronRealOrderTrigger">
<property name="jobDetail" ref="realOrderQuartzJobDetail">
</property>
<!-- 秒 分 时 日 月 星期 -->
<property name="cronExpression" value="0 20 03 ? * 1,2,3,4,5,6,7">
</property>
</bean>
5.配置调度工厂,在调度工厂中,我们调度相应的触发器。这里就是调度上一步配置的cronRealOrderTrigger触发器。
<!-- 调度工厂 -->
<bean id="realOrderQuartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronRealOrderTrigger" />
</list>
</property>
</bean>
这样,我们就配置成功了。运行程序,到指定的时间,就可以触发定时器中的代码了。