Spring Quartz任務調度

使用Quartz調度器

Quart使用TriggerJobJobDetail對象實現各類調度任務。對於Quartz背後的基本概念,參考http://quartz-scheduler.org。爲了方便的目的,Spring提供一組類簡化Quartz在基於Spring應用中的使用。spring

使用JobDetailBean

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)。

使用MethodInvokinJobDetailFactoryBean

一般你須要在指定對象上調用一個方法。使用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標記爲falsecode

<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>

默認狀況下,任務將以併發形式運行。對象

使用觸發器和SchedulerFactoryBean裝配任務

咱們將建立任務detail和任務。咱們也回顧一下容許你在指定對象上調用一個方法的便利bean。固然,咱們將須要任務自身的時間表。使用觸發器和SchedulerFactoryBean來完成。Quartz中有多個觸發器是有效的,Spring提供兩個Quartz FactoryBean默認便利實現:CronTriggerFactoryBeanSimpleTriggerFactoryBean接口

觸發器須要被調度。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,等等。更多細節參考SchedulerFactoryBeanJavaDoc

相關文章
相關標籤/搜索