spring 4.0+quartz2.2 實現持久化

 最近在搭建框架 用到quartz持久化這塊 查了一些文檔  以下配置便可。mysql

 這裏是quartz官方提供配置步驟 http://www.quartz-scheduler.org/spring

 
 Quartz包含三個抽象概念,調度器,任務,觸發器
@1:Job:接口,實現接口方法定義任務
@2:JobDetail:關聯Job實現類和Schedular的類,其構造函數,指定Job實現類,任務在Schedular中的組名和Job名稱
@3:Trigger:觸發器類,描述觸發事件,包含簡單的時間規則和複雜的時間規則,SimpleTrigger和CronTrigger
@4:Schedular:Quartz容器,包含Trigger和JobDetail,

 

       說下跟spring整合並實現持久化sql

        首先在pom中引用quartz官方提供jar數據庫

      

<dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.1</version>
  </dependency>
  <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz-jobs</artifactId>
      <version>2.2.1</version>
  </dependency>
以後再配置quartz的工廠 交給spring管理 便可
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource" /><!-- 數據源 -->
<property name="configLocation" value="classpath:quartz-db.properties" /><!-- ../bin/quartz-db.properties classpath*:quartz-db.properties -->
<property name="startupDelay" value="0" /><!-- 啓動xx秒後開始調度 -->
<property name="autoStartup" value="true"/> 
<property name="schedulerListeners">
<list>
<bean class="com.deppon.quartz.listener.MySchedulerListener"></bean>  <!--這裏只是繼承的監聽 作了一些日誌打印 能夠不要-->
</list>
</property>
</bean>
 

 





接下來是一些quartz的配置  參考博客api

http://orange5458.iteye.com/blog/1170777併發

#配置文件app

org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.scheduler.jmx.export = true
#類名(SimpleThreadPool就好)
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#最大能忍受的觸發超時時間
org.quartz.jobStore.misfireThreshold = 60000
#跳過更新檢查
org.quartz.scheduler.skipUpdateCheck = true
#保存在內存中
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#application本身管理事務
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
#相似於Hibernate的dialect,用於處理DB之間的差別,StdJDBCDelegate能知足大部分的DB
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#jobdataMap轉換出錯
#JobDataMaps是否都爲String類型
#避免 rg.quartz.JobPersistenceException: Couldn't acquire next trigger: Couldn't retrieve trigger: null
#org.quartz.jobStore.useProperties = true
#表前綴
org.quartz.jobStore.tablePrefix = QRTZ_
#自動生成實例id
org.quartz.scheduler.instanceId = AUTO
#是不是應用在集羣中,當應用在集羣中時必須設置爲TRUE,不然會出錯
org.quartz.jobStore.isClustered = true
#scheduler的checkin時間,時間長短影響failure scheduler的發現速度
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
#scheduler的checkin時間,時間長短影響failure scheduler的發現速度
org.quartz.jobStore.clusterCheckinInterval = 20000
#觸發job時是否須要擁有鎖
#org.quartz.jobStore.acquireTriggersWithinLock
#用於管理數據庫中相關信息的鎖機制的類名
#org.quartz.jobStore.lockHandler.class框架

 

 

更多的配置文件含義能夠查看官方文檔。ide

quatrz有兩張存儲方式 一種保存在內存 另外一種持久化函數

持久化須要的表在quartz的官方文檔有描述  。 下面是表

 

QRTZ_CALENDARS 以 Blob 類型存儲 Quartz 的 Calendar 信息 

QRTZ_CRON_TRIGGERS 存儲 Cron Trigger,包括 Cron表達式和時區信息 
QRTZ_FIRED_TRIGGERS 存儲與已觸發的 Trigger 相關的狀態信息,以及相聯 Job的執行信息 QRTZ_PAUSED_TRIGGER_GRPS 存儲已暫停的 Trigger 組的信息 
QRTZ_SCHEDULER_STATE 存儲少許的有關 Scheduler 的狀態信息,和別的 Scheduler實例(假如是用於一個集羣中) 
QRTZ_LOCKS 存儲程序的悲觀鎖的信息(假如使用了悲觀鎖) 
QRTZ_JOB_DETAILS 存儲每個已配置的 Job 的詳細信息 
QRTZ_JOB_LISTENERS 存儲有關已配置的 JobListener 的信息 
QRTZ_SIMPLE_TRIGGERS 存儲簡單的Trigger,包括重複次數,間隔,以及已觸的次數 
QRTZ_BLOG_TRIGGERS Trigger 做爲 Blob 類型存儲(用於 Quartz 用戶用 JDBC建立他們本身定製的 Trigger 類型,JobStore 並不知道如何存儲實例的時候) 
QRTZ_TRIGGER_LISTENERS 存儲已配置的 TriggerListener 的信息 
QRTZ_TRIGGERS 存儲已配置的 Trigger 的信息 
View Code

 

#
# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar
#
# PLEASE consider using mysql with innodb tables to avoid locking issues
#
# In your Quartz properties file, you'll need to set 
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;


CREATE TABLE QRTZ_JOB_DETAILS
(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_SIMPLE_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CRON_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(200) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_SIMPROP_TRIGGERS
( 
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13,4) NULL,
DEC_PROP_2 NUMERIC(13,4) NULL,
BOOL_PROP_1 VARCHAR(1) NULL,
BOOL_PROP_2 VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_BLOB_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CALENDARS
(
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);

CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL, 
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_FIRED_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);

CREATE TABLE QRTZ_SCHEDULER_STATE
(
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);

CREATE TABLE QRTZ_LOCKS
(
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL, 
PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);


commit;

QRTZ_CALENDARS 以 Blob 類型存儲 Quartz 的 Calendar 信息 
QRTZ_CRON_TRIGGERS 存儲 Cron Trigger,包括 Cron表達式和時區信息 
QRTZ_FIRED_TRIGGERS 存儲與已觸發的 Trigger 相關的狀態信息,以及相聯 Job的執行信息 QRTZ_PAUSED_TRIGGER_GRPS 存儲已暫停的 Trigger 組的信息 
QRTZ_SCHEDULER_STATE 存儲少許的有關 Scheduler 的狀態信息,和別的 Scheduler實例(假如是用於一個集羣中) 
QRTZ_LOCKS 存儲程序的悲觀鎖的信息(假如使用了悲觀鎖) 
QRTZ_JOB_DETAILS 存儲每個已配置的 Job 的詳細信息 
QRTZ_JOB_LISTENERS 存儲有關已配置的 JobListener 的信息 
QRTZ_SIMPLE_TRIGGERS 存儲簡單的Trigger,包括重複次數,間隔,以及已觸的次數 
QRTZ_BLOG_TRIGGERS Trigger 做爲 Blob 類型存儲(用於 Quartz 用戶用 JDBC建立他們本身定製的 Trigger 類型,JobStore 並不知道如何存儲實例的時候) 
QRTZ_TRIGGER_LISTENERS 存儲已配置的 TriggerListener 的信息 
QRTZ_TRIGGERS 存儲已配置的 Trigger 的信息
View Code
 
 

 

 

如今你就能夠在你的項目中使用quartz 

//添加一個定時到你的表中   quartz持久化方法只須要調用api便可 

@Resource
private Scheduler scheduler;

@Override
public boolean scheduleJob(String jobGroup, String jobName, String jobClassName, Map<String, Object> dataMap, String cronExpression,String description) {
String info = "添加任務";
boolean result = false;

try {
// 查找任務最終執行對象
Class jobClass= Class.forName(jobClassName);
// this.getClass().getClassLoader().loadClass(name)
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroup)
.withDescription(description)
.storeDurably()//是否持久化 1持久化
.build();
// 遍歷參數,壓入JobDateMap
for (String key : dataMap.keySet()) {
jobDetail.getJobDataMap().put(key, dataMap.get(key));
}
// 表達式調度構建器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
// 按新的cronExpression表達式構建一個新的trigger
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobDetail.getKey().getName(), jobDetail.getKey().getGroup()).withSchedule(cronScheduleBuilder).build();

scheduler.scheduleJob(jobDetail, trigger);
result = true;
} catch (Exception e) {
logger.error(className + ".scheduleJob(" + info + ") 發生異常", e);
}

return result;
}

//構建本身的job 

 
 

public class CopyOfmyJob implements Job {

 
 

@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("我是測試");
}

 

 

 

數據庫如圖

 

更多的方法能夠參考Scheduler 這個類的源碼 對於加載定時 中止定時等 都有描述。

 --後續上述實現的是無狀態的job 若是須要有狀態的job 在2.0之後的jar包裏提供了了註解

@PersistJobDataAfterExecution

若是不支持併發

@disallowconcurrentexecution

 

 

 

--致本身 當你接觸一個新東西的時候,學習最快的方式就是查看官方文檔。

相關文章
相關標籤/搜索