QuartZ--Spring中定时任务的实现
最近在做一个拍卖项目中需要用到定时任务,我们采用的框架是spring mvc的,所以我在考虑集成定时任务方式的时候就选择了我们常用的Quartz,主要是因为他的实现方式比较简单,而且我们在做配置的时候也是方便修改的。
下面我们简单来说下Quartz应用的场景,在我们的项目中,存在一个拍品的有效时常,在这个有效的时常之内任何买家都是可以参与竞价的,当达到拍卖结束时间的时候我们就要通过运算使得这件拍品被价高者得到,这个时候需要生产订单等一系列的操作,那我们在我们的应用中如何知道某个拍品是否达到结束时间并且生成订单等相关操作,这个时候我们就需要定时调度去做这件事情,以帮助我们减少人工开销,说白了就是指定某件事情在什么时候去做!
下面我们就说说如何在我们的Spring框架中集成和使用Quartz,以方便我们程序的使用:
①由于我们是使用maven做项目依赖包管理的,所以我们第一步需要做的是新增我们的Quartz依赖!
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.0</version> </dependency> <dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>20040616</version> </dependency>
②前面也说道我们采用Quartz的目的是让他在指定的时间去帮助我们做指定的业务,所以我们需要写出我们的业务代码,我们的业务代码和其他的java类方法实现一样,属于同一层次下!
package com.xiaocui.quartz; public class QuartzJob { public void work() { //这里就是具体的业务代码实现方法,可以建立多个实现不同的业务! try { logger.error("Hello, QuartZ 启动成功了!"); } catch (Exception e) { logger.error(e, e); } } }
③前面的两步我们把我们业务要做的事情都准备好了,那最后一步就是让我们的业务嵌入到现有的框架代码中,让他能在指定的时间去执行业务,前面我们说到采用Quartz的原因之一是因为他方便配置,下面我们就采用xml配置文件的方式让他嵌入到我们的框架中!
首先我们在我们的【resources】文件夹创建一个我们的xml文件,这里我命名为【spring-quartz.xml】,里面具体的实现内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 要调用的工作类 --> <bean id="quartzJob" class="com.xiaocui.quartz.QuartzJob"></bean> <!-- 定义调用对象和调用对象的方法 这里就是定义具体的业务代码实现方法--> <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 调用的类 --> <property name="targetObject"> <ref bean="quartzJob"/> </property> <!-- 调用类中的方法 --> <property name="targetMethod"> <value>work</value> </property> </bean> <!-- 定义触发时间 --> <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobtask"/> </property> <!-- cron表达式 --> <property name="cronExpression"> <value>0 0/1 * * * ?</value> <!--这里采用的是QuartZ Cron表达式--> </property> </bean> <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="doTime"/> </list> </property> </bean> </beans>
通过上上面的spring-quartz.xml的配置我们的业务代码已经和quartz有了结合,但是这个时候我们的quartz还没有和Spring结合到一起,想要将他们结合到一起只需要一句代码就可以,就是在我们的web.xml启动项中添加启动就可以了,大致代码如下:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml,classpath:spring-mybatis.xml,classpath:spring-quartz.xml</param-value> <!-- classpath:spring-quartz.xml 用于做任务调度 任务定时都可以 添加就执行--> </context-param> <context-param>
通过这简单的三步,我们的定时任务调度就基本实现了,希望能给到帮助,如有问题可以留言讨论,感谢翻阅!