最近看了下quartz排程任务,以前也有用过,但是没有细纠他的配置。这两天看了下,做个小结。
配合 spring 配置 quartz 步骤:
1. 导入 spring.jar,quartz-all-1.6.5.jar (可以换成不同版本)。当然还有其他一些依赖类库,如commons-collections commons-logging.jar ,具体可以查看网络资料,哈哈!
2. 撰写 排程启动时执行的类。并在spring中配置。
<bean id="quartzTest" class="com.test.service.impl.QuartzTest" init-method="init"/>
这个类的内容:
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class QuartzTest extends QuartzJobBean { private String method; public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { if("testQuartz".equals(this.method)) { testQuartz(); } } public void testQuartz() { System.out.println("测试 排程启动!!!"); } public void init() { System.out.println("========================QuartzTest Init========================"); } }
3. 配置 quartz 的jobDetail,CronTriggerBean类(spring 还有个简单的粗粒度的配置simple模式,将摘一篇网友的文章说明)
配置 jobDetail有2种方式
<bean id="testQuartz" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzTest"/> <property name="targetMethod" value="testQuartz"/> <!-在该任务没有完成的情况下,不允许并发发起排程--> <property name="concurrent" value="false"/> </bean>
<bean id="testQuartz" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="tw.com.synnex.competency.service.impl.QuartzTest" /> <property name="jobDataAsMap"> <map><entry key="method" value="testQuartz" /></map> </property> </bean>
很明显,后面那种配置,还要在 quartzTest类里面加 method属性。也没法控制并发。(这个经常导致排程堵塞)
接下来配置 testQuartzCronTrigger
<bean id="testQuartzCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="testQuartz"/> <!--每分钟启动一次,具体配置见我博客上另外一个介绍 cronExpression文章--> <property name="cronExpression" value="0 0/1 * * * ?"/> </bean>
4. 配置 spring排程启动工厂。
<!--lazy-init="false" 这个属性配置程序一启动就触发一次--> <bean id="schedulerFactoryBean" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="exchangeScoreSeviceCronTrigger" /> <ref bean="transToTableSeviceCronTrigger" /> <ref bean="testQuartzCronTrigger" /> </list> </property> </bean>
5. 配置好这些,启动web服务就Ok啦。