quartz學習總結:
1、關於job:
用Quartz的行話講,做業是一個執行任務的簡單Java類。任務能夠是任何Java代碼。只需你實現org.quartz.Job接口而且在出現嚴重 錯誤狀況下拋出JobExecutionException異常便可。Job接口包含惟一的一個方法execute(),做業從這裏開始執行。一旦實現了 Job接口和execute()方法,當Quartz肯定該是做業運行的時候,它將調用你的做業。Execute()方法內就徹底是你要作的事情。要注 意,本身實現job時必須有一個public 的無參數的構造方法.對於job,大多數狀況下都要依賴於某些具體的條件,這時,就要用到JobDataMap了。JobDataMap是Map的一個子 類,獲取時很簡單,直接用get方法就ok了,基於參數,咱們就能夠定製不一樣的job任務了。下面是一個簡單的job,用來列舉出全部的參數而且得到參數 名爲name的值.html
public class HelloJob implements Job {web
private static Log _log = LogFactory.getLog(HelloJob.class);sql
public HelloJob() {
}數據庫
public void execute(JobExecutionContext context)
throws JobExecutionException {express
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();服務器
_log.info("要執行的參數以下:");
Iterator i = jobDataMap.entrySet().iterator();
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
_log.info(me.getKey() + ": "+me.getValue());
}
_log.info("U Are Welcome:"+jobDataMap.get("name"));
}框架
}ide
2、關於jobdetail:
Quartz並不存儲一個真正的Job實例,相反的,它經過jobdetail來定義job,並指定job的name和group,在一個調度器 (Scheduler)中,name和group是惟一被定義的,一個觸發器(trigger)只能指定一個job,但多個觸發器能夠指定同一個job.sqlserver
Scheduler的做用就是調用任務,在指定的時間執行指定的任務。主要方法以下:學習
scheduleJob(JobDetail jobDetail, Trigger trigger):把jobDetail添加到調度器中,並指定觸發器trigger.在這裏要注意,在同一個調度器中,jobDetail的name和 group是惟一的;Trigger的name和group也必須是惟一的。若是在trigger中指定job的name,則該name必須和 jobDetail的name保持一致,不然會拋出異常。
scheduleJob(Trigger trigger):指定的trigger中必須包含jobdetai的name.以便於讓quartz知道要執行的任務,若是指定的jobdetail的 name不在調度器中的任務列表中,則會拋出JobPersistenceException異常。
4、關於做業存儲
Quartz提供兩種基本做業存儲類型。
第一種類型叫作RAMJobStore,它利用一般的內存來持久化調度程序信息。這種做業存儲類型最容易配置、構造和運行。對許多應用來講,這種做業存儲 已經足夠了。然而,由於調度程序信息是存儲在被分配給JVM的內存裏面,因此,當應用程序中止運行時,全部調度信息將被丟失。
第二種類型稱爲JDBC做業存儲。Quartz提供兩種不一樣的實現,但兩種實現通常都須要JDBC驅動程序和後臺數據庫來持久化調度程序信息。這兩種類型 的不一樣在於你是否想要控制數據庫事務或這釋放控制給應用服務器例如BEA's WebLogic或Jboss。(這相似於J2EE領域中,Bean管理的事務和和容器管理事務之間的區別)這兩種JDBC做業存儲是:
· JobStoreTX:當你想要控制事務或工做在非應用服務器環境中是使用 (注:本身控制事務)。
· JobStoreCMT:當你工做在應用服務器環境中和想要容器控制事務時使用 (web服務器控制事務)。
Quartz中的觸發器用來告訴調度程序做業何時觸發。框架提供了一把觸發器類型,但兩個最經常使用的是SimpleTrigger和CronTrigger。SimpleTrigger爲須要簡單打火調度而設計。
6、關於Quartz中的幾個表:
QRTZ_TRIGGERS 存放Trigger(包括SIMPLE_TRIGGERS和CRON_TRIGGERS)和jobDetail的對應關係
QRTZ_TRIGGER_LISTENERS
QRTZ_SIMPLE_TRIGGERS 存儲簡單觸發器
QRTZ_SCHEDULER_STATE
QRTZ_PAUSED_TRIGGER_GRPS
QRTZ_LOCKS
QRTZ_JOB_LISTENERS
QRTZ_JOB_DETAILS 存儲jobDetail
QRTZ_FIRED_TRIGGERS
QRTZ_CRON_TRIGGERS 存儲複雜觸發器CRON_TRIGGERS
QRTZ_CALENDARS
QRTZ_BLOB_TRIGGERS
7、把quartz集成到web應用中
一、根據quartz中提供的建表文檔,創建數據庫.
二、把以下quartz.properties文件放置到classes目錄下.文件內容以下:
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
#調度器名,可有可無,名字任意定
org.quartz.scheduler.instanceName = ZXScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 12
org.quartz.threadPool.threadPriority = 5
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#若是設置內存,就不要設置clusterCheckinInterval等屬性
#在這裏本身控制事務
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#配置dataSource名
org.quartz.jobStore.dataSource = myDS
#表前綴
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.dataSource.myDS.driver = com.microsoft.jdbc.sqlserver.SQLServerDriver
org.quartz.dataSource.myDS.URL = jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=quartzTest
org.quartz.dataSource.myDS.user = sa
org.quartz.dataSource.myDS.password = sa
org.quartz.dataSource.myDS.maxConnections = 5
三、配置web.xml,啓動quartz的初試化類,添加初始化servlet
8、構造cron觸發器(我的翻譯,英文很差,莫見笑)
cron 觸發器規範:
Seconds Minutes Hours Day-of-month Month Day-of-Week Year
秒 分 時 天 月 周 年
關於字符串的設置(在cron expression中全部字符不區分大小寫):
The '*' character is used to specify all values. For example, "*" in the minute field means "every minute".
"*"字符被用來指定全部的值,例如,"*"在分鐘字段時表示每一分鐘
The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify 'no specific value'. This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.
"?"字符在天和周字段中使用。表示沒有指定值,天和周字段指定一個,但不能兩個都指定爲"?"
The ',' character is used to specify additional values. For example "MON,WED,FRI" in the day-of-week field means "the days Monday, Wednesday, and Friday".
','字符被用來設置添加的值,例如在周字段設置"MON,WED,FRI"的意義即爲:在周1、周3、週五激活
The '/' character is used to specify increments. For example "0/15" in the seconds field means "the seconds 0, 15, 30, and 45". And "5/15" in the seconds field means "the seconds 5, 20, 35, and 50". You can also specify '/' after the '*' character - in this case '*' is equivalent to having '0' before the '/'.
The '#' character is allowed for the day-of-week field. This character is used to specify "the nth" XXX day of the month. For example, the value of "6#3" in the day-of-week field means the third Friday of the month (day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of the month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the given day-of-week in the month, then no firing will occur that month.
'#'被用在周字段。它用來指定第幾個周幾中激活。如:"6#3"-->月的第三個週五;"2#1"-->月的第一個週一;"4#5"-- >月的第五個週三。要注意,若是要使用#後面跟5,但當月並無第五週相應的周天,那麼job將不被執行(激活);
The 'C' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "calendar". This means values are calculated against the associated calendar, if any. If no calendar is associated, then it is equivalent to having an all-inclusive calendar. A value of "5C" in the day-of-month field means "the first day included by the calendar on or after the 5th". A value of "1C" in the day-of-week field means "the first day included by the calendar on or after sunday".
Support for specifying both a day-of-week and a day-of-month value is not complete (you'll need to use the '?' character in on of these fields).
同時在周、天中使用'?'還不完善,目前只在二者中使用一個。
Pay attention to the effects of '?' and '*' in the day-of-week and day-of-month fields!
要注意'?'和'*'在周和天字段帶來的影響。
注意如下例子:
一、"0 15 10 * * 6L 2002-2005" 在2002至2005年的每個月天天的10:15觸發。 二、"0 15 10 ? * 6L 2002-2005" 在2002至2005年的每個月的最後一個週五觸發。 1中*表示天天,覆蓋了6L(最後一個週五)