Quart使用Trigger、Job和JobDetail對象實現各類調度任務。對於Quartz背後的基本概念,參考http://quartz-scheduler.org。爲了方便的目的,Spring提供一組類簡化Quartz在基於Spring應用中的使用。spring
JobDetail對象包含須要運行任務的全部信息。Spring框架提供一個JobDetailBean使用更多合理默認值的真實JavaBean產生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>
package example; public class ExampleJob extends QuartzJobBean { private int timeout; /** * ExampleJob從JobDetailBean實例化以後Setter被調用 */ public void setTimeout(int timeout) { this.timeout = timeout; } protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException { // 作實際工做 } }
全部對JobDetailBean的額外設置固然對你也是有效的。
使用name和group屬性,你能分別修改任務的name和group。默認狀況下,任務的name匹配JobDetailBean的name(在上 面的例子中,是exampleJob)。
一般你須要在指定對象上調用一個方法。使用MethodInvokingJobDetailFactoryBean你能夠作到這一點:框架
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="exampleBusinessObject" /> <property name="targetMethod" value="doIt" /> </bean>
上面的例子將致使exampleBusinessObject的doIt方法被調用:this
public class ExampleBusinessObject { // 屬性和引用 public void doIt() { // 真實業務 } }
<bean id="exampleBusinessObject" class="examples.ExampleBusinessObject"/>
使用MethodInvokingJobDetailFactoryBean,你不須要建立一行任務當即調用一個方法,你只須要建立一個實際業務對象並裝配給detail對象。spa
默認狀況下,Quartz任務是無狀態的,致使任務相互干擾的可能性。若是你使用相同的JobDetail指定兩個觸發器,他可能在第一個任務以前完成,第二個任務纔開始。若是JobDetail累實現Stateful接口,這將不會發生。第二個任務將不會再第一個任務完成以前開始。爲了使來源於MethodInvokingJobDetailFactoryBean的任務是非併發的,設置concurrent標記爲false。code
<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>
默認狀況下,任務將以併發形式運行。對象
咱們將建立任務detail和任務。咱們也回顧一下容許你在指定對象上調用一個方法的便利bean。固然,咱們將須要任務自身的時間表。使用觸發器和SchedulerFactoryBean來完成。Quartz中有多個觸發器是有效的,Spring提供兩個Quartz FactoryBean默認便利實現:CronTriggerFactoryBean和SimpleTriggerFactoryBean。接口
觸發器須要被調度。Spring提供一個SchedulerFactoryBean暴露觸發器做爲屬性設置。SchedulerFactoryBean使用這些觸發器調度實際任務。get
看看下面的例子:io
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!--調用上面例子中的方法 --> <property name="jobDetail" ref="jobDetail" /> <!-- 10秒 --> <property name="startDelay" value="10000" /> <!--沒50秒重複一次 --> <property name="repeatInterval" value="50000" /> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="exampleJob" /> <!--天天早上六點鐘運行 --> <property name="cronExpression" value="0 0 6 * * ?" /> </bean>
如今,咱們設置兩個觸發器,一個10秒的啓動延時每50秒運行一次,另外一個天天早上6點運行一次。最後完成一件事,咱們須要設置SchedulerFactoryBean:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> <ref bean="simpleTrigger" /> </list> </property> </bean>
你能爲SchedulerFactoryBean設置更多有效的屬性,例如使用日曆的任務detail,使用屬性來定製Quartz,等等。更多細節參考SchedulerFactoryBean的JavaDoc。