1.依賴
<!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> <!--調度器核心包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.4.RELEASE</version> </dependency>
需要引入的jar包, 這里是采用maven的dependency依賴; 如果沒有使用maven, 可以對照着上面的jar包截圖一一進行下載. 這里唯一需要注意的就是, 如果使用spring 3.1以下的版本, quartz就需要相應的2.0以下版本, 否則會導致 org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'cronTrigger_1' defined in file [E:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\git-common\WEB-INF\classes\applicationContext.xml]: problem with class file or dependent class; nested exception isjava.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class 錯誤.
后續: 后來使用了spring 4.0.5.RELEASE版本+quartz 2.2.1版本, 還是報出了以上錯誤, 將quartz降低為1.8.6版本后, 問題消失...
2.舉例代碼
/** *要定時執行的任務一 * **/ package com.quartz.demo; import java.util.Date; public class Job1Demo { public void sayHello() { System.out.println(new Date() + " -> Hello, 我是任務 1"); } }
/** *要定時執行的任務一 * **/ package com.quartz.demo; import java.util.Date; public class Job2Demo { public void sayHello() { System.out.println(new Date() + " -> Hello, 我是任務 2"); } }
3.配置定時器applicationContext-quartz.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd "> <!-- 將自定義job交給spring(將類注入Spring管理Bean) --> <bean name="job1" class="com.quartz.demo.Job1Demo"/> <!-- 配置JobDetail --> <bean id="SpringQtzJobMethod_1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="concurrent" value="false" /> <!--false表示等上一個任務執行完后再開啟新的任務(默認是true) --> <property name="targetObject"> <ref bean="job1" /> </property> <property name="targetMethod"> <!-- 要執行的方法名稱 --> <value>sayHello</value> <!-- 要執行的方法名稱 --> </property> </bean> <!-- 配置調度觸發器 --> <bean id="cronTriggerFactoryBean_1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "> <property name="jobDetail" ref="SpringQtzJobMethod_1"></property> <!-- 每5秒執行一次 --> <property name="cronExpression" value="0/5 * * * * ?"></property> </bean> <!-- 將自定義job交給spring(將類注入Spring管理Bean) --> <bean name="job2" class="com.quartz.demo.Job2Demo"/> <!-- 配置JobDetail --> <bean id="SpringQtzJobMethod_2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="concurrent" value="false" /> <!--false表示等上一個任務執行完后再開啟新的任務(默認是true) --> <property name="targetObject"> <ref bean="job2" /> </property> <property name="targetMethod"> <!-- 要執行的方法名稱 --> <value>sayHello</value> <!-- 要執行的方法名稱 --> </property> </bean> <!-- 配置調度觸發器 --> <bean id="cronTriggerFactoryBean_2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "> <property name="jobDetail" ref="SpringQtzJobMethod_2"></property> <!-- 每5秒執行一次 --> <property name="cronExpression" value="0/5 * * * * ?"></property> </bean> <!-- 項目啟動就先執行一次,再按照間隔時間重復執行(SimpleTrigger) <bean id="simpleTriggerFactoryBean" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="SpringQtzJobMethod_2" /> <property name="startDelay" value="2000" /> 啟動延遲 單位/毫秒 <property name="repeatInterval" value="20000" /> 間隔時間 <property name="repeatCount" value="-1" /> 重復次數(-1:無數次;0:一次.....) </bean> --> <!-- 配置調度工廠 --> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 添加觸發器 --> <property name="triggers"> <list> <ref bean="cronTriggerFactoryBean_1"/> <ref bean="cronTriggerFactoryBean_2"/> <!-- <ref bean="simpleTriggerFactoryBean"/> --> </list> </property> </bean> </beans>
4.web.xml加載定時配置文件
<display-name>Archetype Created Web Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext-*.xml</param-value> </context-param> <!-- Spring 容器啟動監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
5.時間計算cron表達式
一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。
按順序依次為
1 秒(0~59)
2 分鍾(0~59)
3 小時(0~23)
4 天(0~31)
5 月(0~11)
6 星期(1~7 1為SUN-依次為SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)
在線時間計算cron表達式:http://cron.qqe2.com/
6.作者實際運用在項目中遇到的問題:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 異常
解決方法:
這個是因為spring容器里面有兩個類型一樣的bean,但是spring不知道加載哪一個,需要你手動指定一個默認的加載(會優先加載@Primary注解的類型) 用@Primary在標識在Class上面 。
參考文章:
https://www.jianshu.com/p/d0edb298e891
https://www.cnblogs.com/qlqwjy/p/8721963.html