1. 程式人生 > >spring中定時器編寫示例

spring中定時器編寫示例

1、pom.xml增加:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <quartz.version>2.2.1</quartz.version>
</dependency>

2、applicationContext.xml中增加如下內容:

<bean id="loadReportJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
>
<property name="targetObject"> <ref bean="moduleScheduleJob"/><!-- 目標bean:這裡bean受spring管理 --> </property> <property name="targetMethod"> <value>moduleSchedule</value><!-- 目標方法:bean裡的方法 --> </property
>
</bean> <bean id="CronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="loadReportJobMethod"></property> <property name="cronExpression" value="0/60 * * * * ?"></property
>
<!-- 定時時間設定 --> </bean> <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="CronTriggerFactoryBean"/> </list> </property> </bean>

3、Java檔案(定時任務方法):

package com.iflytek.epdcloud.demc.quartz.job;

@Component
public class ModuleScheduleJob{
    //目標方法
    public void moduleSchedule() {
        //省略方法內容
   }
}

4、注意問題:ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean

a、報錯示例:

2017-05-16 15:15:15.966 [localhost-startStop-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Ignoring bean class loading failure for bean 'CronTriggerFactoryBean'
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'CronTriggerFactoryBean' defined in URL [file:/C:/Program%20Files/apache-tomcat-8.0.9/wtpwebapps/demc-web/WEB-INF/classes/spring/applicationContext.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1352) ~[AbstractBeanFactory.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:628) ~[AbstractAutowireCapableBeanFactory.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:597) ~[AbstractAutowireCapableBeanFactory.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1445) ~[AbstractBeanFactory.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:445) [DefaultListableBeanFactory.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:415) [DefaultListableBeanFactory.class:4.2.3.RELEASE]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:86) [PostProcessorRegistrationDelegate.class:4.2.3.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:677) [AbstractApplicationContext.class:4.2.3.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:519) [AbstractApplicationContext.class:4.2.3.RELEASE]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) [ContextLoader.class:4.2.3.RELEASE]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) [ContextLoader.class:4.2.3.RELEASE]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) [ContextLoaderListener.class:4.2.3.RELEASE]
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4760) [catalina.jar:8.0.9]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5184) [catalina.jar:8.0.9]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.9]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) [catalina.jar:8.0.9]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) [catalina.jar:8.0.9]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_121]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121]
Caused by: java.lang.ClassNotFoundException: org.springframework.scheduling.quartz.CronTriggerBean
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1324) ~[catalina.jar:8.0.9]
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1177) ~[catalina.jar:8.0.9]
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) ~[ClassUtils.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:394) ~[AbstractBeanDefinition.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1397) ~[AbstractBeanFactory.class:4.2.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1344) ~[AbstractBeanFactory.class:4.2.3.RELEASE]
    ... 20 common frames omitted

b、報錯原因:

是因為quartz的配置資訊用的是舊版本、而依賴的確是高版本的jar包
在quartz 1.8.6及以前版本的時候 排程觸發器 依賴的類是 org.springframework.scheduling.quartz.CronTriggerBean
在2.xx版本之後就改為了org.springframework.scheduling.quartz.CronTriggerFactoryBean
因此當你依賴2.x.x版本之後只需將排程觸發器的依賴類改為 org.springframework.scheduling.quartz.CronTriggerFactoryBean即可

c、解決方法示例: