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://gong1208.iteye.com/blog/1773177