spring3.0以后提供自带的定时任务,编写起来很方便。但是在这里我讲解的并不是使用spring提供的定时任务模块,而是使用quartz ,quartz 是一种功能强大的定时工具。spring提供了对quartz的接口。
一,准备:
1.下载spring3.2, 下载地址;
2.下载:quartz 2.2.1 , 下载地址:http://www.quartz-scheduler.org/
二,项目的目录结构以及所需的jar包如下:
1.编写需要定时执行的java类TaskScanner.java
package com.bjsxt.cronjob;
public class TaskScaner {
public void execScanTask(){
System.out.println("定时任务....");
}
}
2.配置spring的bean文件cron_job.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="taskScaner" class="com.bjsxt.cronjob.TaskScaner"> </bean> <bean id="taskScanerDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="taskScaner" /> </property> <property name="targetMethod"> <value>execScanTask</value> </property> </bean> <bean id="taskScanerTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="cronExpression"> <value>0/1 * * * * ?</value><!-- 定时任务执行频率 --> </property> <property name="jobDetail"> <ref bean="taskScanerDetail" /> </property> </bean> <!-- --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="taskScanerTrigger" /> </list> </property> </bean> </beans>
3.编写测试类UserServiceTest.java
package com.bjsxt.service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserServiceTest {
public static void main(String[] args) throws Exception {
String[] configs = {"cron_job.xml"};
ApplicationContext act = new ClassPathXmlApplicationContext(configs);
}
}
problem :
Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class
解决:
原因是Spring 3.0版本中支持Quartz版本是2.0以下的,在使用最新的Quartz包(>2.0)之后,接口不兼容。
解决办法有两种:
1.降低Quartz版本,降到1.X去。
2.升级Spring版本到3.1+,根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean 就可以替换成 CronTriggerFactoryBean。替换之后问题解决。
参考:http://www.oschina.net/question/8676_9032
http://gong1208.iteye.com/blog/1773177