最近项目上需要用到定时任务,目前采用spring+quartz架构实现
项目采用Maven管理
需要依赖的Jar包如下
quartz-1.8.5.jar
commons-logging.jar
spring-core-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring.transaction-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
在Spring中使用Quartz有两种方式:
①任务继承QuartzJobBean
②在配置文件中定义需要执行的任务和方法
考虑到需要动态更改任务的执行时间以及动态添加,这里采用第二种方式
下面以项目上的例子作为展示(每隔20秒更新中间表数据)
步骤如下:
①创建业务任务
package cn.o.system.middletable.action; import java.io.UnsupportedEncodingException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import cn.o.system.base.action.BaseAction; import cn.o.system.middletable.services.IMiddleTableServices; /** * @ClassName: MiddleTableAction * @Description: 中间表定时任务action层处理类 * @author tate zhou * @date 2018-5-24 * @version V1.0 */ @Component("scheduleAction") @Scope("prototype") public class MiddleTableAction extends BaseAction { private static final long serialVersionUID = 1L; @Autowired private IMiddleTableServices middleTableServicesImpl; /**************************************************** spring定时器刷新缓存执行方法 ****************************************************/ /** * * @方法:generateMidTableSchedule * @描述:间隔30秒对中间表数据全量更新 * @param: MiddleTableAction * @author: tate zhou * @date :2018-5-17 * @version: V1.0 * @throws UnsupportedEncodingException */ public void generateMidTableSchedule() { try { middleTableServicesImpl.generateMidTableData(); } catch (Exception e) { e.printStackTrace(); } } }
②配置定时任务文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- Spring整合Quartz进行配置遵循下面的步骤:
1:定义工作任务的Job
2:定义触发器Trigger,并将触发器与工作任务绑定
3:定义调度器,并将Trigger注册到Scheduler
--> <bean id="middleTableAction" class="cn.o.system.middletable.action.MiddleTableAction"></bean> <!-- 中间表数据更新任务定时生成 --> <bean id="generateMidTableTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="middleTableAction"/> </property> <property name="targetMethod"> <value>generateMidTableSchedule</value> </property> </bean> <!-- 配置一个触发器 --> <bean id="generateMiddleTableRecord" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="generateMidTableTask"/> </property> <property name="cronExpression"> <value>*/20 * * * * ?"</value> </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="generateMiddleTableRecord"/> </list> </property> </bean> </beans>
备注:设置定时任务时间的格式
位置 - 含义
1 - 秒(0–59)
2 - 分(0–59)
3 - 时(0–23)
4 - 日(1–31)
5 - 月(1–12)
6 - 星期(SUN–SAT or 1–7)
7 - 年(可选, 1970–2099)