2013-02-27 56 views
1

我們有使用Spring框架在Tomcat上運行的Web應用程序。我們需要爲經常性操作添加一些預定工作。我們偶然發現了Quartz Scheduler,並跟進了tutorial for configuring Jobs using Quartz with Spring,並按預期安排了工作。與Quartz調度使用默認值計劃作業

因此,我們必須在應用程序啓動時被安排一些任務。現在我們希望用戶手動運行作業並更改作業的觸發器,但我們需要將這些更改持久保存到數據庫中。所以當應用程序啓動時,它會讀取持久化任務,如果它們不存在,則從spring描述符文件加載默認任務。

爲了簡單的晃動,讓我們假設我們使用的beans.xml文件從例子:

<bean id="processToExecute" class="com.mycompany.ProcessToExecute" /> 

<bean name="processToExecuteJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="com.mycompany.ProcessToExecuteJob" /> 
    <property name="jobDataAsMap"> 
     <map> 
      <entry key="processToExecute" value-ref="processToExecute" /> 
     </map> 
    </property> 
</bean> 

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

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="jobDetails"> 
     <list> 
      <ref bean="processToExecuteJob" /> 
     </list> 
    </property> 
    <property name="triggers"> 
     <list> 
      <ref bean="simpleTrigger" /> 
     </list> 
    </property> 
</bean> 

所以我們想繼續使用默認任務豆狀結構,但選項如果已經安排,則從數據庫加載它們

這裏Quartz是不是必需的,如果有誰知道一個簡單的方法使用Spring @Scheduled來實現它,它可能是有用的。

謝謝你的時間。

+1

很少指針,您可以通過傳遞數據源到SchedulerFactoryBean來創建一個持久存儲 – 2013-02-28 09:09:28

回答

1

我終於艱難地獲得所需的行爲。在第一次運行時,應用程序計劃任務並將其保存到數據庫。這是通過指定的SchedulerFactoryBean來對象的數據源屬性簡單地完成。

這時,持續的工作是無用的,因爲當系統重新啓動,因爲新創造的就業覆蓋舊的計劃任務執行的任何更改將丟失。所以行爲完全一樣。

爲了避免新的工作覆蓋舊的,只需將overwriteExistingJobs屬性設置爲SchedulerFactoryBean來對象。就如此容易。新作業被忽略,因爲它們已經存在於數據庫中。

這是上述的結構完整的示例:

<!-- Jobs --> 
<bean name="processToExecuteJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- JobDetailBean on Quartz 1.X --> 
    <property name="jobClass" value="com.mycompany.quartz.ProcessToExecuteJob" /> 
    <property name="name" value="processToExecuteJob"/> 
    <property name="group" value="default"/> 
</bean> 


<!-- Triggers --> 
<bean id="demoTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- CronTriggerBean on Quartz 1.X --> 
    <property name="jobDetail" ref="processToExecuteJob" /> 
    <property name="cronExpression" value="0/15 * * * * ?" /> 
</bean> 


<!-- Database --> 
<jee:jndi-lookup id="quartzDataSource" jndi-name="jdbc/imsQuartzDS" resource-ref="true" /> 


<!-- Scheduler --> 
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="dataSource" ref="quartzDataSource"/> 
    <property name="overwriteExistingJobs" value="false"/> 
    <property name="triggers"> 
     <list> 
      <ref bean="demoTrigger" /> 
     </list> 
    </property> 
</bean>