最近项目中用到了Quartz任务调度来实现定时任务的功能,遂做小结,以便学习交流之用。Quartz是一个开源的作业调度框架,可以用它来创建简单或者多个复杂的任务,并让这些任务按计划执行。我所做的项目是使用了Spring中集成的Quartz插件,首先说明一下需求背景,这里要实现的一个功能是定时将满足条件的商铺推荐给用户。
整体思路是这样子的,首先编写好需要做定时任务的业务逻辑方法;紧接着做Quartz任务调度的配置,包括线程池,业务逻辑bean,添加要定时任务的方法,调度触发器,添加任务调度;
1、编写需要做定时任务的业务方法
public class ShopRecommendJob {
private static final Logger logger = LoggerFactory.getLogger(ShopRecommendJob.class);
public void shopRecommendJobMethod(){
try {
//商铺推荐的业务逻辑方法
} catch (Exception e) {
e.printStackTrace();
logger.error("定时任务失败:"+e.getMessage());
}
}
}
2、Quartz任务调度的配置(主要是Spring的配置,因为这里使用的是Spring集成Quartz)
(1)线程池配置
<!-- 使用spring的线程池 -->
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>
这里使用的是spring-context-3.1.1.RELEASE.jar包下的org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor类,其中,配置ThreadPoolTaskExecutor类几个属性的含义分别是:
corePoolSize:线程池维护线程的最少数量
maxPoolSize:线程池维护线程的最大数量
queueCapacity:线程池所使用的缓冲队列
(2)定义包含需要定时任务的业务逻辑方法Bean
<bean id="shopRecommendJob" class="com.jobs.ShopRecommendJob"></bean>
这个类里面有你定义的需要做定时任务的逻辑方法(即包含shopRecommendJobMethod()方法的类ShopRecommendJob )。
(3)添加要定时任务的方法
<bean id="shopRecommendTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >
<property name="targetObject">
<!-- 包含定时任务方法的Bean,即第二步中定义的shopRecommendJob Bean -->
<ref bean="shopRecommendJob"/>
</property>
<property name="targetMethod">
<!-- 你的定时任务方法 -->
<value>shopRecommendJobMethod</value>
</property>
</bean>
MethodInvokingJobDetailFactoryBean类是在spring-context-support-3.1.1.RELEASE.jar包中org.springframework.scheduling.quartz路径下。
(4)配置触发器
<bean id="shopRecommendTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<!-- 这里是第三步配置的定时任务 -->
<ref bean="shopRecommendTask"/>
</property>
<property name="cronExpression">
<!-- 这里是定时任务的表达式,此处的意思是“每天凌晨1点30执行一次” -->
<value>0 30 1 * * ?</value>
</property>
</bean>
触发器Bean,CronTriggerBean是引用于spring-context-support-3.1.1.RELEASE.jar包中的org.springframework.scheduling.quartz路径下。另外,关于定时任务的表达式,这里没有整理总结,网上有很多。
(5)添加任务调度
<bean autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- 这里写第四步配置的触发器,可以有多个,写法如下 -->
<ref bean="shopRecommendTrigger"/>
</list>
</property>
<!-- 这里引用第一步配置的Spring线程池 -->
<property name="taskExecutor" ref="executor"></property>
</bean>
任务调度工厂Bean,SchedulerFactoryBean是在spring-context-support-3.1.1.RELEASE.jar包中的org.springframework.scheduling.quartz路径下。
至此,任务调度的配置完成。当然,如果你的这些配置时单独写在一个XML文件中,别忘了将这个Spring配置文件引入总的Spring文件中,并在web.xml配置监听器,将Spring总的配置文件配置进去。