Spring與Quartz集成詳解

首先這個所有的依賴包就不需要多講了,首先下載Quazrt發佈包,解壓,運行doc文件夾下(E:\Quartz\quartz-2.2.3\docs\dbTables)的tables_mysql_innodb.sql腳本 
新建job 
//MyJob 普通job,這個不需要實現org.quartz.Job 
Java代碼  
  1. package job;  
  2. import org.slf4j.Logger;  
  3. import org.slf4j.LoggerFactory;  
  4.   
  5. public class MyJob {  
  6.     Logger log = LoggerFactory.getLogger(MyJob.class);  
  7.     public void work () {  
  8.         // 此任務僅打印日誌便於調試、觀察  
  9.         log.info("==================:"+this.getClass().getName() + " was just triggered...");  
  10.     }    
  11. }  

//MyQuartzJob,這個job因爲我們要把job持久化到RDB所以要實現org.quartz.Job 
Java代碼 下載
  1. package job;  
  2. import org.quartz.Job;  
  3. import org.quartz.JobExecutionContext;  
  4. import org.quartz.JobExecutionException;  
  5. import org.slf4j.Logger;  
  6. import org.slf4j.LoggerFactory;  
  7.   
  8. public class MyQuartzJob implements Job{  
  9.     Logger log = LoggerFactory.getLogger(MyQuartzJob.class);  
  10.     @Override  
  11.     public void execute(JobExecutionContext jobexecutioncontext)  
  12.             throws JobExecutionException {  
  13.         log.info("==================:"+this.getClass().getName() + " was just triggered...");  
  14.     }  
  15. }  

Spring與Quartz的集成配置 
//SchedulerFactoryBean配置 
Java代碼  
  1. quartz.xml  
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
  6.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  8.     http://www.springframework.org/schema/beans/spring-beans.xsd   
  9.     http://www.springframework.org/schema/context     
  10.     http://www.springframework.org/schema/context/spring-context.xsd">  
  11.     <!-- 調度工廠 -->  
  12.     <bean id="quartzScheduler"  
  13.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  14.         <property name="dataSource" ref="dataSource" />  
  15.         <property name="quartzProperties">  
  16.             <props>  
  17.                 <prop key="org.quartz.scheduler.instanceName">defaultScheduler</prop>  
  18.                 <prop key="org.quartz.scheduler.instanceId">AUTO</prop>  
  19.                 <!-- 線程池配置 -->  
  20.                 <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>  
  21.                 <prop key="org.quartz.threadPool.threadCount">20</prop>  
  22.                 <prop key="org.quartz.threadPool.threadPriority">5</prop>  
  23.                 <!-- JobStore配置 -->  
  24.                 <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>  
  25.                 <!-- 集羣配置 -->  
  26.                 <prop key="org.quartz.jobStore.isClustered">true</prop>  
  27.                 <prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>  
  28.                 <prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">1</prop>  
  29.                 <prop key="org.quartz.jobStore.misfireThreshold">120000</prop>  
  30.                 <!-- 表名配置 -->  
  31.                 <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>  
  32.             </props>  
  33.         </property>  
  34.         <property name="schedulerName" value="defaultScheduler" />  
  35.         <!-- 必須的,QuartzScheduler 延時啓動,應用啓動完後 QuartzScheduler 再啓動 -->  
  36.         <property name="startupDelay" value="30" />  
  37.         <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />  
  38.         <!-- 可選,QuartzScheduler 啓動時更新己存在的Job,這樣就不用每次修改targetObject後刪除qrtz_job_details表對應記錄了 -->  
  39.         <property name="overwriteExistingJobs" value="true" />  
  40.         <!-- 設置自動啓動 -->  
  41.         <property name="autoStartup" value="true" />  
  42.         <!-- 註冊觸發器 -->  
  43.         <property name="triggers">  
  44.             <ref bean="defaultTriggers" />  
  45.         </property>  
  46.         <!-- 註冊jobDetail -->  
  47.         <property name="jobDetails">  
  48.             <ref bean="defaultJobDetails" />  
  49.         </property>  
  50.         <!-- 註冊監聽器 -->  
  51.         <property name="schedulerListeners">  
  52.             <ref bean="defaultSchedulerListeners" />  
  53.         </property>  
  54.     </bean>  
  55.     <import resource="quartz-task.xml" />  
  56. </beans>  

//定時任務配置 下載
quartz-task.xm 
Java代碼  
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:util="http://www.springframework.org/schema/util"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans      
  6.     http://www.springframework.org/schema/beans/spring-beans.xsd   
  7.     http://www.springframework.org/schema/util  
  8.     http://www.springframework.org/schema/util/spring-util.xsd">  
  9.     <!-- 工作的bean -->  
  10.     <bean id="myJob" class="job.MyJob" />  
  11.     <!-- job的配置開始 -->  
  12.     <bean id="myJobDetail"  
  13.         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  14.         <property name="targetObject" ref="myJob" />  
  15.         <property name="targetMethod" value="work" />  
  16.         <!-- <property name="concurrent" value="false" /> -->  
  17.     </bean>  
  18.     <bean id="myQuartzJobDetail"  
  19.         class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
  20.         <property name="jobClass" value="job.MyQuartzJob" />  
  21.         <property name="name" value="myQuartzJob" />  
  22.         <!-- 任務完成之後是否依然保留到數據庫,默認false -->  
  23.         <property name="durability" value="true" />  
  24.     </bean>  
  25.     <!-- job的配置結束 -->  
  26.     <!-- 調度任務配置開始 -->  
  27.     <bean id="cronTestJobTrigger"  
  28.         class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  29.         <property name="jobDetail" ref="myJobDetail" />  
  30.         <!-- Cron表達式“0/5 * * * * ?”意爲:每5秒執行一次。 -->  
  31.         <property name="cronExpression" value="0/5 * * * * ?" />  
  32.     </bean>  
  33.     <bean id="cronTestQuartzJobTrigger"  
  34.         class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
  35.         <property name="jobDetail" ref="myQuartzJobDetail" />  
  36.         <property name="cronExpression" value="0/5 * * * * ?" />  
  37.     </bean>  
  38.     <!-- 默認調度器(defaultScheduler)觸發器配置 -->  
  39.     <util:list id="defaultTriggers">  
  40.         <!-- <ref bean="crontestJobTrigger"/> -->  
  41.         <ref bean="cronTestQuartzJobTrigger" />  
  42.     </util:list>  
  43.     <!-- 默認調度器(defaultScheduler)Job實例配置 -->  
  44.     <util:list id="defaultJobDetails">  
  45.     </util:list>  
  46.     <!-- 默認調度器(defaultScheduler)監聽器配置 -->  
  47.     <util:list id="defaultSchedulerListeners">  
  48.     </util:list>  
  49.     <!-- JobDetail-配置示例 -->  
  50.     <!-- <bean id="demoJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">   
  51.             <property name="jobClass" value="job.MyQuartzJob" />   
  52.             <property name="jobDataAsMap">   
  53.                 <map>   
  54.                     <entry key="key" value="value" />   
  55.                 </map>  
  56.             </property>  
  57.          </bean> -->  
  58. </beans>  

啓動web控制檯輸出: 下載
信息: Server startup in 11783 ms 
2016-09-09 17:44:00 -32594 [org.springframework.scheduling.quartz.SchedulerFactoryBean] INFO    - Starting Quartz Scheduler now, after delay of 30 seconds 
2016-09-09 17:44:00 -32660 [org.quartz.core.QuartzScheduler] INFO    - Scheduler defaultScheduler_$_donaldHP1473414210553 started. 
2016-09-09 17:44:01 -32758 [job.MyQuartzJob] INFO    - ==================:job.MyQuartzJob was just triggered... 
2016-09-09 17:44:01 -32802 [job.MyQuartzJob] INFO    - ==================:job.MyQuartzJob was just triggered... 
2016-09-09 17:44:01 -32842 [job.MyQuartzJob] INFO    - ==================:job.MyQuartzJob was just triggered... 
查看數據庫Quartz,job,trriger相關信息: 
mysql> use test; 
Database changed 
mysql> select * from qrtz_cron_triggers; 
+------------------+--------------------------+---------------+-----------------+---------------+ 
| SCHED_NAME       | TRIGGER_NAME             | TRIGGER_GROUP | CRON_EXPRESSION | TIME_ZONE_ID  | 
+------------------+--------------------------+---------------+-----------------+---------------+ 
| defaultScheduler | cronTestQuartzJobTrigger | DEFAULT       | 0/5 * * * * ?  | Asia/Shanghai | 
+------------------+--------------------------+---------------+-----------------+---------------+ 
1 row in set 

mysql> select * from qrtz_fired_triggers; 
+------------------+------------------------------------+--------------------------+---------------+-----------------------+---------------+---------------+----------+----------+----------+-----------+------------------+-------------------+ 
| SCHED_NAME       | ENTRY_ID                           | TRIGGER_NAME             | TRIGGER_GROUP | INSTANCE_NAME         | FIRED_TIME    | SCHED_TIME    | PRIORITY | STATE    | JOB_NAME | JOB_GROUP | IS_NONCONCURRENT | REQUESTS_RECOVERY | 
+------------------+------------------------------------+--------------------------+---------------+-----------------------+---------------+---------------+----------+----------+----------+-----------+------------------+-------------------+ 
| defaultScheduler | donaldHP14734142105531473414210556 | cronTestQuartzJobTrigger | DEFAULT       | donaldHP1473414210553 | 1473414385029 | 1473414390000 |        0 | ACQUIRED | NULL     | NULL      | 0                | 0                 | 
+------------------+------------------------------------+--------------------------+---------------+-----------------------+---------------+---------------+----------+----------+----------+-----------+------------------+-------------------+ 
1 row in set 

mysql> select * from qrtz_triggers; 
+------------------+--------------------------+---------------+-------------+-----------+-------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+----------+ 
| SCHED_NAME       | TRIGGER_NAME             | TRIGGER_GROUP | JOB_NAME    | JOB_GROUP | DESCRIPTION | NEXT_FIRE_TIME | PREV_FIRE_TIME | PRIORITY | TRIGGER_STATE | TRIGGER_TYPE | START_TIME    | END_TIME | CALENDAR_NAME | MISFIRE_INSTR | JOB_DATA | 
+------------------+--------------------------+---------------+-------------+-----------+-------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+----------+ 
|defaultScheduler | cronTestQuartzJobTrigger | DEFAULT       | myQuartzJob | DEFAULT   | NULL        |  1473414390000 |  1473414385000 |        0 | ACQUIRED      | CRON         | 1473414210000 |        0 | NULL          |             0 |          | 
+------------------+--------------------------+---------------+-------------+-----------+-------------+----------------+----------------+----------+---------------+--------------+---------------+----------+---------------+---------------+----------+ 
1 row in set 

mysql> select * from qrtz_job_details; 
+------------------+-------------+------------------+-------------+-----------------+------------+------------------+----------------+-------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| SCHED_NAME       | JOB_NAME    | JOB_GROUP        | DESCRIPTION | JOB_CLASS_NAME  | IS_DURABLE | IS_NONCONCURRENT | IS_UPDATE_DATA | REQUESTS_RECOVERY | JOB_DATA                                                                           

| defaultScheduler | myQuartzJob | DEFAULT          | NULL        | job.MyQuartzJob | 1          | 0                | 0              | 0                 |  
? 
loadFactorI 


mysql> select * from qrtz_locks; 
+------------------+----------------+ 
| SCHED_NAME       | LOCK_NAME      | 
+------------------+----------------+ 
| defaultScheduler | STATE_ACCESS   | 
| defaultScheduler | TRIGGER_ACCESS | 
+------------------+----------------+ 
2 rows in set 

mysql> select * from qrtz_scheduler_state; 
+------------------+-----------------------+-------------------+------------------+ 
| SCHED_NAME       | INSTANCE_NAME         | LAST_CHECKIN_TIME | CHECKIN_INTERVAL | 
+------------------+-----------------------+-------------------+------------------+ 
| defaultScheduler | donaldHP1473414210553 |     1473414375985 |            15000 | 
+------------------+-----------------------+-------------------+------------------+ 
1 row in set 

說明: 
定時任務配置有兩種方式 
第一種:MethodInvokingJobDetailFactoryBean 下載
Java代碼  
  1. <bean id="myJobDetail"   class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  2.         <property name="targetObject" ref="myJob" />  
  3.         <property name="targetMethod" value="work" />  
  4.         <!-- <property name="concurrent" value="false" /> -->  
  5. </bean>  

如果用這種方式的話,要屏蔽一下配置 
Java代碼  
  1. <property name="dataSource" ref="dataSource" />  
  2.         <property name="quartzProperties">  
  3.             <props>  
  4.                 <prop key="org.quartz.scheduler.instanceName">defaultScheduler</prop>  
  5.                 <prop key="org.quartz.scheduler.instanceId">AUTO</prop>  
  6.                 <!-- 線程池配置 -->  
  7.                 <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>  
  8.                 <prop key="org.quartz.threadPool.threadCount">20</prop>  
  9.                 <prop key="org.quartz.threadPool.threadPriority">5</prop>  
  10.                 <!-- JobStore配置 -->  
  11.                 <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>  
  12.                 <!-- 集羣配置 -->  
  13.                 <prop key="org.quartz.jobStore.isClustered">true</prop>  
  14.                 <prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>  
  15.                 <prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">1</prop>  
  16.                 <prop key="org.quartz.jobStore.misfireThreshold">120000</prop>  
  17.                 <!-- 表名配置 -->  
  18.                 <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>  
  19.             </props>  
  20.         </property>  

第二種:JobDetailFactoryBean 下載
Java代碼  
  1. <bean id="myQuartzJobDetail"  
  2.         class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
  3.         <property name="jobClass" value="job.MyQuartzJob" />  
  4.         <property name="name" value="myQuartzJob" />  
  5.         <!-- 任務完成之後是否依然保留到數據庫,默認false -->  
  6.         <property name="durability" value="true" />  
  7. </bean>  

主要是JobDetailFactory得實現不同,第一種不需要實現org.quartz.Job,而第二種需要實現org.quartz.Job;爲什麼會有這兩種方式呢,用的時候該用那種方式,第一種方式定時任務存在RAM中,應用啓動時,任務信息及任務調度信息易丟失,要避免任務信息及任務調度信息,需將任務相關信息持久化到RDB,這就是第二種方式的job爲什麼要實現org.quartz.Job原因,因爲保存到數據庫需要job-bean的相關信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章