Spring包含了对定时调度服务的内置支持类。
当前,Spring支持从JDK1.3开始内置的Timer类和Quartz Scheduler(关于这个我就不做详细的介绍了,我主要是简要接扫我们在使用的时候怎样的快速的上手),二者都可以通过 FactoryBean,分别指向Timer或Trigger实例的引用进行配置。更进一步,有个对Quartz Scheduler和Timer都有效的工具类可以让你调用某个目标对象的方法(类似通常的MethodInvokingJobDetailFactoryBean操作)。
我首先介绍一下MethodInvokingJobDetailFactoryBean的使用方法。
通常的情况下我们只需调用一下某个类对象的一个特定方法去执行定时任务就行了。这时候我们使用MethodInvokingFactoryBean就能轻松的做到这一点。
MethodInvokingJobDetailFactoryBean
首先我们定义一个自己的类,里面存了一些我们要执行的定时任务。下面是我在实际项目中自己定义的一个类,用于执行数据库的数据检查转换的两个方法,这个类就是一个普通的java类。
package cashpay.user.task;
public class DailyBankCardAndBindIdTask {
//定时每天要执行的任务
public void checkBankCardAndBindIdForEveryDay() {
}
//在特定时间执行的任务
public void checkBankCardAndBindIdForFirstTime() {
}
}
定义好了这个java类以后,下面就是最重要的事情了,开始配置文件,applicationContext.xml文件的部分代码配置
MethodInvokingJobDetailFactoryBean
MethodInvokingJobDetailFactoryBean
<!-- 定时任务 -->
<!-- 首先定义一个bean-->
<bean id="bankCardAndBindIdDailyCheckerJob" class="cashpay.user.task.DailyBankCardAndBindIdTask" />
<!-- 把bankCardAndBindIdDailyCheckerJob方法作为一个定时任务-->
<bean id="bankCardAndBindIdDailyCheckerTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref local="bankCardAndBindIdDailyCheckerJob" />
</property>
<property name="targetMethod">
<value>checkBankCardAndBindIdForEveryDay</value>
</property>
<property name="concurrent" value="false" />
</bean>
<!-- 确定bankCardAndBindIdDailyCheckerTask任务执行的时间 -->
<bean id="bankCardAndBindIdDailyCheckerCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="bankCardAndBindIdDailyCheckerTask" />
</property>
<property name="cronExpression">
<!--每天凌晨3点 -->
<value>0 0 3 * * ?</value>
</property>
</bean>
<!-- 把checkBankCardAndBindIdForFirstTime方法作为一个定时任务-->
<bean id="bankCardAndBindIdCheckerTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref local="bankCardAndBindIdDailyCheckerJob" />
</property>
<property name="targetMethod">
<value>checkBankCardAndBindIdForFirstTime</value>
</property>
<property name="concurrent" value="false" />
</bean>
<!-- 设置checkBankCardAndBindIdForFirstTime任务执行的时间-->
<bean id="bankCardAndBindIdCheckerCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="bankCardAndBindIdCheckerTask" />
</property>
<property name="cronExpression">
<!--第一次更新数据 -->
<value>0 10 16 25 12 ?</value>
</property>
</bean>
<!-- 总管理 -->
<bean lazy-init="false"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup" value="true" />
<property name="triggers">
<list>
<ref local="bankCardAndBindIdDailyCheckerCron" />
<ref local="bankCardAndBindIdCheckerCron" />
</list>
</property>
</bean>
</beans>
这样定时任务就完成了。
注意红色字段:所有的job任务是在并行方式下运行的,而且quertz job是在无状态下执行的,所以有可能互相影响,有可能在第一个任务没有完成的情况下,第二个任务又完成了,所以为了避免这种情况的发生,我们就是必须把concurrent设置为false。默认不设置的情况下是为true的。
当前,Spring支持从JDK1.3开始内置的Timer类和Quartz Scheduler(关于这个我就不做详细的介绍了,我主要是简要接扫我们在使用的时候怎样的快速的上手),二者都可以通过 FactoryBean,分别指向Timer或Trigger实例的引用进行配置。更进一步,有个对Quartz Scheduler和Timer都有效的工具类可以让你调用某个目标对象的方法(类似通常的MethodInvokingJobDetailFactoryBean操作)。
我首先介绍一下MethodInvokingJobDetailFactoryBean的使用方法。
通常的情况下我们只需调用一下某个类对象的一个特定方法去执行定时任务就行了。这时候我们使用MethodInvokingFactoryBean就能轻松的做到这一点。
MethodInvokingJobDetailFactoryBean
首先我们定义一个自己的类,里面存了一些我们要执行的定时任务。下面是我在实际项目中自己定义的一个类,用于执行数据库的数据检查转换的两个方法,这个类就是一个普通的java类。
package cashpay.user.task;
public class DailyBankCardAndBindIdTask {
//定时每天要执行的任务
public void checkBankCardAndBindIdForEveryDay() {
}
//在特定时间执行的任务
public void checkBankCardAndBindIdForFirstTime() {
}
}
定义好了这个java类以后,下面就是最重要的事情了,开始配置文件,applicationContext.xml文件的部分代码配置
MethodInvokingJobDetailFactoryBean
MethodInvokingJobDetailFactoryBean
<!-- 定时任务 -->
<!-- 首先定义一个bean-->
<bean id="bankCardAndBindIdDailyCheckerJob" class="cashpay.user.task.DailyBankCardAndBindIdTask" />
<!-- 把bankCardAndBindIdDailyCheckerJob方法作为一个定时任务-->
<bean id="bankCardAndBindIdDailyCheckerTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref local="bankCardAndBindIdDailyCheckerJob" />
</property>
<property name="targetMethod">
<value>checkBankCardAndBindIdForEveryDay</value>
</property>
<property name="concurrent" value="false" />
</bean>
<!-- 确定bankCardAndBindIdDailyCheckerTask任务执行的时间 -->
<bean id="bankCardAndBindIdDailyCheckerCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="bankCardAndBindIdDailyCheckerTask" />
</property>
<property name="cronExpression">
<!--每天凌晨3点 -->
<value>0 0 3 * * ?</value>
</property>
</bean>
<!-- 把checkBankCardAndBindIdForFirstTime方法作为一个定时任务-->
<bean id="bankCardAndBindIdCheckerTask"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref local="bankCardAndBindIdDailyCheckerJob" />
</property>
<property name="targetMethod">
<value>checkBankCardAndBindIdForFirstTime</value>
</property>
<property name="concurrent" value="false" />
</bean>
<!-- 设置checkBankCardAndBindIdForFirstTime任务执行的时间-->
<bean id="bankCardAndBindIdCheckerCron" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="bankCardAndBindIdCheckerTask" />
</property>
<property name="cronExpression">
<!--第一次更新数据 -->
<value>0 10 16 25 12 ?</value>
</property>
</bean>
<!-- 总管理 -->
<bean lazy-init="false"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup" value="true" />
<property name="triggers">
<list>
<ref local="bankCardAndBindIdDailyCheckerCron" />
<ref local="bankCardAndBindIdCheckerCron" />
</list>
</property>
</bean>
</beans>
这样定时任务就完成了。
注意红色字段:所有的job任务是在并行方式下运行的,而且quertz job是在无状态下执行的,所以有可能互相影响,有可能在第一个任务没有完成的情况下,第二个任务又完成了,所以为了避免这种情况的发生,我们就是必须把concurrent设置为false。默认不设置的情况下是为true的。