当前位置: 首页 > 知识库问答 >
问题:

使用Quartz调度程序调度的作业,带有默认值

幸经艺
2023-03-14

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

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

为了简单起见,让我们假设我们使用的是示例中的 be.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实现它的更简单的方法,它也可能是有用的。

谢谢你的时间。

共有1个答案

闻人越
2023-03-14

我终于努力获得想要的行为。在第一次运行时,应用程序计划任务并将其保存到数据库。只需在 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>
 类似资料:
  • 我正在一个POC中工作,我想消费来自Kafka主题“用户”的消息。尝试实现一旦spring boot scheduler在预定时间或cron时间触发,消费者应该从Kafka主题读取消息,然后我们应该开始从Kafka主题逐个消费现有消息并处理这些消息,当所有的消息被消费,那么Kafka消费者应该停止。调度程序应在cron时间触发并再次启动进程。 我已经尝试了以下方法来实现这一点,尽管我正在努力确定如

  • 我想使用Quartz和Oracle作为JobStore来安排作业。我看到了大多数使用RAMjobstore的示例(当然它不是持久的),但几乎没有任何一个可以帮助我满足Spring boot Quartz Oracle开发的需求。 如有任何指向代码示例或github项目的链接或帮助,将不胜感激。

  • 我使用Quartz调度器执行10个作业。所有这些工作都有自己的导火索。因此它们是异步执行的。 然而,现在我需要这些工作中的2个,以更具体的方式执行。假设Job1每偶数分钟执行一次,Job2每奇数分钟执行一次。现在我想让Job2等待Job1完成。示例:Job1在10:02开始执行。10点03分,Job2的触发器被触发。但是在Job2开始执行之前,如果Job1已经完成,它将查看它。 你知道我怎么解决问

  • 我正在寻找最好的解决方案,以创建一个java web应用程序,以生成Excel/PDF格式的报告。类似于Google Adwords的东西,用户可以创建日程报告,并在以后生成报告时下载。 我正在考虑开发一个java应用程序,在其中用户记录,选择一个预先定义的报告,并提供输入参数(如报告日期等),这个请求将被排队或保存为Quarts作业(首选持久队列)。一个作业将监视队列/作业并执行该作业,生成报告

  • 我正在使用Quartz调度器,但我不知道如何并行运行作业。配置文件中有什么东西可以允许我这样做吗?