2013-02-27 58 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>