使用默认值的 Quartz 调度器调度作业

red*_*t84 1 java spring quartz-scheduler

我们有一个使用 Spring Framework 在 Tomcat 中运行的 Web 应用程序。我们需要为循环操作添加一些预定的作业。我们为此遇到了 Quartz 调度器,并遵循了使用 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>
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的时间。

red*_*t84 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>
Run Code Online (Sandbox Code Playgroud)