新建job
//MyJob 普通job,這個不需要實現org.quartz.Job
- package job;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class MyJob {
- Logger log = LoggerFactory.getLogger(MyJob.class);
- public void work () {
- // 此任務僅打印日誌便於調試、觀察
- log.info("==================:"+this.getClass().getName() + " was just triggered...");
- }
- }
//MyQuartzJob,這個job因爲我們要把job持久化到RDB所以要實現org.quartz.Job
- package job;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class MyQuartzJob implements Job{
- Logger log = LoggerFactory.getLogger(MyQuartzJob.class);
- @Override
- public void execute(JobExecutionContext jobexecutioncontext)
- throws JobExecutionException {
- log.info("==================:"+this.getClass().getName() + " was just triggered...");
- }
- }
Spring與Quartz的集成配置
//SchedulerFactoryBean配置
- quartz.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd">
- <!-- 調度工廠 -->
- <bean id="quartzScheduler"
- class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="quartzProperties">
- <props>
- <prop key="org.quartz.scheduler.instanceName">defaultScheduler</prop>
- <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
- <!-- 線程池配置 -->
- <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
- <prop key="org.quartz.threadPool.threadCount">20</prop>
- <prop key="org.quartz.threadPool.threadPriority">5</prop>
- <!-- JobStore配置 -->
- <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
- <!-- 集羣配置 -->
- <prop key="org.quartz.jobStore.isClustered">true</prop>
- <prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>
- <prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">1</prop>
- <prop key="org.quartz.jobStore.misfireThreshold">120000</prop>
- <!-- 表名配置 -->
- <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
- </props>
- </property>
- <property name="schedulerName" value="defaultScheduler" />
- <!-- 必須的,QuartzScheduler 延時啓動,應用啓動完後 QuartzScheduler 再啓動 -->
- <property name="startupDelay" value="30" />
- <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
- <!-- 可選,QuartzScheduler 啓動時更新己存在的Job,這樣就不用每次修改targetObject後刪除qrtz_job_details表對應記錄了 -->
- <property name="overwriteExistingJobs" value="true" />
- <!-- 設置自動啓動 -->
- <property name="autoStartup" value="true" />
- <!-- 註冊觸發器 -->
- <property name="triggers">
- <ref bean="defaultTriggers" />
- </property>
- <!-- 註冊jobDetail -->
- <property name="jobDetails">
- <ref bean="defaultJobDetails" />
- </property>
- <!-- 註冊監聽器 -->
- <property name="schedulerListeners">
- <ref bean="defaultSchedulerListeners" />
- </property>
- </bean>
- <import resource="quartz-task.xml" />
- </beans>
//定時任務配置 下載
quartz-task.xm
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util.xsd">
- <!-- 工作的bean -->
- <bean id="myJob" class="job.MyJob" />
- <!-- job的配置開始 -->
- <bean id="myJobDetail"
- class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject" ref="myJob" />
- <property name="targetMethod" value="work" />
- <!-- <property name="concurrent" value="false" /> -->
- </bean>
- <bean id="myQuartzJobDetail"
- class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
- <property name="jobClass" value="job.MyQuartzJob" />
- <property name="name" value="myQuartzJob" />
- <!-- 任務完成之後是否依然保留到數據庫,默認false -->
- <property name="durability" value="true" />
- </bean>
- <!-- job的配置結束 -->
- <!-- 調度任務配置開始 -->
- <bean id="cronTestJobTrigger"
- class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
- <property name="jobDetail" ref="myJobDetail" />
- <!-- Cron表達式“0/5 * * * * ?”意爲:每5秒執行一次。 -->
- <property name="cronExpression" value="0/5 * * * * ?" />
- </bean>
- <bean id="cronTestQuartzJobTrigger"
- class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
- <property name="jobDetail" ref="myQuartzJobDetail" />
- <property name="cronExpression" value="0/5 * * * * ?" />
- </bean>
- <!-- 默認調度器(defaultScheduler)觸發器配置 -->
- <util:list id="defaultTriggers">
- <!-- <ref bean="crontestJobTrigger"/> -->
- <ref bean="cronTestQuartzJobTrigger" />
- </util:list>
- <!-- 默認調度器(defaultScheduler)Job實例配置 -->
- <util:list id="defaultJobDetails">
- </util:list>
- <!-- 默認調度器(defaultScheduler)監聽器配置 -->
- <util:list id="defaultSchedulerListeners">
- </util:list>
- <!-- JobDetail-配置示例 -->
- <!-- <bean id="demoJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
- <property name="jobClass" value="job.MyQuartzJob" />
- <property name="jobDataAsMap">
- <map>
- <entry key="key" value="value" />
- </map>
- </property>
- </bean> -->
- </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 下載
- <bean id="myJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <property name="targetObject" ref="myJob" />
- <property name="targetMethod" value="work" />
- <!-- <property name="concurrent" value="false" /> -->
- </bean>
如果用這種方式的話,要屏蔽一下配置
- <property name="dataSource" ref="dataSource" />
- <property name="quartzProperties">
- <props>
- <prop key="org.quartz.scheduler.instanceName">defaultScheduler</prop>
- <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
- <!-- 線程池配置 -->
- <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
- <prop key="org.quartz.threadPool.threadCount">20</prop>
- <prop key="org.quartz.threadPool.threadPriority">5</prop>
- <!-- JobStore配置 -->
- <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
- <!-- 集羣配置 -->
- <prop key="org.quartz.jobStore.isClustered">true</prop>
- <prop key="org.quartz.jobStore.clusterCheckinInterval">15000</prop>
- <prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">1</prop>
- <prop key="org.quartz.jobStore.misfireThreshold">120000</prop>
- <!-- 表名配置 -->
- <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
- </props>
- </property>
第二種:JobDetailFactoryBean 下載
- <bean id="myQuartzJobDetail"
- class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
- <property name="jobClass" value="job.MyQuartzJob" />
- <property name="name" value="myQuartzJob" />
- <!-- 任務完成之後是否依然保留到數據庫,默認false -->
- <property name="durability" value="true" />
- </bean>
主要是JobDetailFactory得實現不同,第一種不需要實現org.quartz.Job,而第二種需要實現org.quartz.Job;爲什麼會有這兩種方式呢,用的時候該用那種方式,第一種方式定時任務存在RAM中,應用啓動時,任務信息及任務調度信息易丟失,要避免任務信息及任務調度信息,需將任務相關信息持久化到RDB,這就是第二種方式的job爲什麼要實現org.quartz.Job原因,因爲保存到數據庫需要job-bean的相關信息。