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它也可能很有用。
谢谢你的时间。
我终于努力获得所需的行为。在第一次运行时,应用程序调度任务并将它们持久化到数据库中。这只需通过在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)
| 归档时间: |
|
| 查看次数: |
5230 次 |
| 最近记录: |