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="commodityClassService" ref="commodityClassService" /> <property name="searchService" ref="searchService" /> </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>
这样,我们就配置成功了。