gpt4 book ai didi

java - 使用具有默认值的 Quartz 调度程序的计划作业

转载 作者:行者123 更新时间:2023-11-29 03:36:45 25 4
gpt4 key购买 nike

我们有一个使用 Spring 框架在 Tomcat 中运行的 Web 应用程序。我们需要为经常性操作添加一些计划作业。我们为此遇到了 Quartz Scheduler 并遵循了 tutorial for configuring Jobs using Quartz with Spring并按预期安排和运行作业。

所以我们有一些任务是在应用程序启动时安排的。现在我们希望用户手动运行作业并更改作业的触发器,但我们需要将这些更改持久保存到数据库中。因此,当应用程序启动时,它会读取持久化任务,如果它们不存在,则从 spring 描述 rune 件中加载默认任务。

为简单起见,假设我们使用示例中的 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>

因此,我们希望继续为默认任务使用类似 beans 的配置,但如果已经安排好,则可以选择从数据库加载它们。

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

感谢您的宝贵时间。

最佳答案

我终于努力获得所需的行为。在第一次运行时,应用程序会安排任务并将它们保存到数据库中。这只需在 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>

关于java - 使用具有默认值的 Quartz 调度程序的计划作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com