1

我们有一个使用 Spring Framework 在 Tomcat 中运行的 Web 应用程序。我们需要为经常性操作添加一些计划作业。为此,我们遇到了 Quartz Scheduler,并按照教程使用 Quartz 和 Spring 配置作业,并按预期安排和运行作业。

所以我们在应用程序启动时安排了一些任务。现在我们希望用户手动运行作业并更改作业的触发器,但我们需要将这些更改持久化到数据库中。因此,当应用程序启动时,它会读取持久化的任务,如果它们不存在,则从 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>

因此,我们希望继续对默认任务使用类似 bean 的配置,但如果已经安排好了从数据库加载它们的选项。

这里的 Quartz 不是必需的,如果有人知道使用 Spring 实现它的更简单方法,@Scheduled它也可能很有用。

谢谢你的时间。

4

1 回答 1

5

我终于努力获得所需的行为。在第一次运行时,应用程序安排任务并将它们持久化到数据库中。这只需在SchedulerFactoryBean对象上指定dataSource属性即可。

此时,持久化作业是没有用的,因为对计划任务执行的任何更改都会在系统重新启动时丢失,因为新创建的作业会覆盖旧作业。所以行为是完全一样的。

为避免新作业覆盖旧作业,只需在SchedulerFactoryBean对象上将overwriteExistingJobs属性设置为false 。就如此容易。新作业将被忽略,因为它们已存在于数据库中。

这是上述配置的完整示例:

<!-- 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>
于 2013-02-28T18:15:55.530 回答