?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
Quartz使用Trigger
, Job
以及JobDetail
等對象來進行各種類型的任務調度。關于Quartz的基本概念,請參閱http://www.opensymphony.com/quartz。為了讓基于Spring的應用程序方便使用,Spring提供了一些類來簡化uartz的用法。
JobDetail
對象保存運行一個任務所需的全部信息。Spring提供一個叫作JobDetailBean
的類讓JobDetail
能對一些有意義的初始值進行初始化。讓我們來看個例子:
<bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="example.ExampleJob" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="5" /> </map> </property> </bean>
Job detail bean擁有所有運行job(ExampleJob
)的必要信息。
可以通過job的data map來制定timeout。Job的data map可以通過JobExecutionContext
(在運行時刻傳遞給你)來得到,但是JobDetailBean
同時把從job的data map中得到的屬性映射到實際job中的屬性中去。
所以,如果ExampleJob中包含一個名為timeout
的屬性,JobDetailBean
將自動為它賦值:
package example;
public class ExampleJob extends QuartzJobBean {
private int timeout;
public void setTimeout(int timeout) {
this.timeout = timeout;
}
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
// do the actual work
}
}
當然,你同樣可以對Job detail bean中所有其他的額外配置進行設置。
注意:使用name
和group
屬性,你可以分別修改job在哪一個組下運行和使用什么名稱。 默認情況下,job的名稱等于job detail bean的名稱(在上面的例子中為exampleJob
)。
通常情況下,你只需要調用特定對象上的一個方法即可實現(xiàn)任務調度。你可以使用MethodInvokingJobDetailFactoryBean
準確的做到這一點:
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="exampleBusinessObject" /> <property name="targetMethod" value="doIt" /> </bean>
上面例子將調用exampleBusinessObject
中的doIt
方法(如下):
public class ExampleBusinessObject { // properties and collaborators public void doIt() { // do the actual work } }
<bean id="exampleBusinessObject" class="examples.ExampleBusinessObject"/>
使用MethodInvokingJobDetailFactoryBean
你不需要創(chuàng)建只有一行代碼且只調用一個方法的job, 你只需要創(chuàng)建真實的業(yè)務對象來包裝具體的細節(jié)的對象。
默認情況下,Quartz Jobs是無狀態(tài)的,可能導致jobs之間互相的影響。如果你為相同的JobDetail
指定兩個Trigger,
很可能當?shù)谝粋€job完成之前,第二個job就開始了。如果JobDetail
對象實現(xiàn)了Stateful
接口,就不會發(fā)生這樣的事情。
第二個job將不會在第一個job完成之前開始。為了使得jobs不并發(fā)運行,設置MethodInvokingJobDetailFactoryBean
中的concurrent
標記為false
。
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="exampleBusinessObject" /> <property name="targetMethod" value="doIt" /> <property name="concurrent" value="false" /> </bean>
注意:默認情況下,jobs在并行的方式下運行。
我們已經(jīng)創(chuàng)建了job details,jobs。我們同時回顧了允許你調用特定對象上某一個方法的便捷的bean。
當然我們仍需要調度這些jobs。這需要使用triggers和SchedulerFactoryBean
來完成。
Quartz自帶一些可供使用的triggers。Spring提供兩個子類triggers,分別為CronTriggerBean
和SimpleTriggerBean
。
Triggers也需要被調度。Spring提供SchedulerFactoryBean
來暴露一些屬性來設置triggers。SchedulerFactoryBean
負責調度那些實際的triggers。
來看幾個例子:
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <!-- see the example of method invoking job above --> <property name="jobDetail" ref="jobDetail" /> <!-- 10 seconds --> <property name="startDelay" value="10000" /> <!-- repeat every 50 seconds --> <property name="repeatInterval" value="50000" /> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="exampleJob" /> <!-- run every morning at 6 AM --> <property name="cronExpression" value="0 0 6 * * ?" /> </bean>
現(xiàn)在我們創(chuàng)建了兩個triggers,其中一個開始延遲10秒以后每50秒運行一次,另一個每天早上6點鐘運行。
我們需要創(chuàng)建一個SchedulerFactoryBean
來最終實現(xiàn)上述的一切:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> <ref bean="simpleTrigger" /> </list> </property> </bean>
更多的屬性你可以通過SchedulerFactoryBean
來設置,例如job details使用的Calendars, 用來訂制Quartz的一些屬性以及其它相關信息。
你可以查閱相應的JavaDOC(http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/scheduling/quartz/SchedulerFactoryBean.html)來了解進一步的信息。