1. 程式人生 > >Quartz與Spring整合的2種方式

Quartz與Spring整合的2種方式

Quartz與Spring整合有2種方式:
1.MethodInvokeJobDetailFactoryBean
2.JobDetailBean
下面分別介紹這兩種方式。
1.MethodInvokeJobDetailFactoryBean
1)建立一個Job類,此類不需要實現任何介面,不需要繼承任何類

public class MyJobTest {
    public void execute(){
        System.out.println("正在執行quartz任務的一個方法。。。");
    }
}

2)配置XML

<!-- 第一種整合方式:MethodInvokingJobDetailFactoryBean,並且job類,直接是pojo類,與普通類沒有區別 -->
<!-- 定義具體的任務類 --> <bean id="myJob" class="com.high.quartz.MyJobTest" /> <!-- 定義JobDetail --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 目標類 --> <property name="targetObject"
ref="myJob" />
<!-- 目標類中要執行的方法,這個引數是必須的 --> <property name="targetMethod" value="execute" /> </bean> <!-- 定義simpleTrigger觸發器 --> <bean id="simpleTaskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!-- 延遲10秒啟動,然後每隔3秒執行一次,一共執行8次 -->
<property name="jobDetail" ref="jobDetail" /> <property name="repeatCount" value="8" /> <property name="startDelay" value="10000" /> <property name="repeatInterval" value="3000" /> </bean> <!-- 定義cronTrigger觸發器 --> <bean id="cronTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail" /> <!-- 下午4點25分開始,每5秒執行一次 --> <property name="cronExpression" value="0/5 25 16 ? * *" /> </bean> <!-- 設定排程 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <ref bean="cronTaskTrigger" /> </property> </bean>

2.JobDetailBean
1)需要繼承QuartzJobBean類或者實現Job方法

public class MyJobBeanTest extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("測試Quartz:Hello Quartz");
    }
}

2)配置XML

<!-- 第二種配置方式,需要繼承QuartzJobBean -->
    <!-- jobClass關聯到一個繼承自QuartzJobBean的類,它實現了Quartz作業介面。呼叫到這個作業的時候,它的executeInternal將被執行。-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.high.quartz.MyJobBeanTest" />
        <property name="durability" value="true" />
    </bean>

    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="startDelay" value="3000" />
        <property name="repeatInterval" value="2000" />
    </bean>

    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0/5 46 16 ? * *" />
    </bean>

    <!-- 總管理類,如果lazy-init='false' 那麼容器啟動就會指定排程程式 -->
    <bean id="startQuartz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 管理trigger -->
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
            </list>
        </property>
    </bean>

3.兩種整合方式的簡單說明
1)使用MethodInvokeJobDetailFactoryBean則需要指定targetObject(任務例項)和targetMethod(例項中要執行的方法)
2)使用QuartzJobBean,需要繼承。
前者優點是無侵入,業務邏輯簡單,一目瞭然,缺點是無法持久化。
從我使用的經驗來說,我更推薦的第二種,其中一個很重要的原因就是因為定時任務中注入相關Service的時候,後者可以直接注入,而前者還需要進行Scheduler的替換修改。