1. 程式人生 > >Spring Quartz 和 Spring Task使用比較

Spring Quartz 和 Spring Task使用比較

Spring Quartz 和 Spring Task執行時間對比:
1. Quartz設定同步模式時:一個任務的兩次執行的時間間隔是:“執行時間”和“trigger的設定間隔”的最大值
2. Task默認同步模式:一個任務的兩次執行的時間間隔是:“執行時間”+“trigger的設定間隔”,即一個任務完成執行後,才開始trigger計時

Spring Quartz 特點:
1. 預設多執行緒非同步執行
2. 一個任務在上一次排程未完成執行,下一次排程時間到時,會另起一個執行緒開始新的排程。在業務繁忙時,一個任務或許會有多個執行緒在執行,導致資料處理異常。
3. 單任務同步:配置屬性,可以使一個任務的一次排程在未完成時,而不會開啟下一次排程
4. 多個任務同時執行,任務之間沒有直接的影響,多工執行的快慢取決於CPU的效能
5. SchedulerFactoryBean不能使用註解來配置?還是我沒找到註解的方法?

Spring Task特點:
1. 預設單執行緒同步執行
2. 一個任務執行完上一次之後,才會執行下一次排程
3. 多工之間按順序執行,一個任務執行完成之後才會執行另一個任務
4. 多工並行執行需要設定執行緒池
5. 全程可以通過註解配置

Spring Quartz配置:
1. 配置Job,job的targetObject可以使用spring註解@Service(value = “findObjectService”)配置的bean
2. 配置Trigger
3. 配置Scheduler


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="findObjectJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
> <property name="targetObject" ref="findObjectService" /> <property name="targetMethod" value="startJob" /> <property name="concurrent" value="false" /> </bean> <bean id="findObjectTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="findObjectJob" /> <property name="repeatInterval" value="1000" /> <property name="startDelay" value="5000" /> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="findObjectTrigger" /> </list> </property> </bean>

Spring Task配置:
1. 執行方法新增@Scheduled註解
2. 配置執行緒池

@Scheduled(cron = "0/1 * *  * * ? ")
public void startJob() {......}

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"  
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/task  
        http://www.springframework.org/schema/task/spring-task-3.1.xsd">
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />
<context:annotation-config />  
<context:component-scan base-package="com.test1,com.test2"/>