java - 运行错过的 Quartz 作业

标签 java spring groovy scheduled-tasks quartz-scheduler

我使用 Quartz 和 Spring 在每个月第一天的午夜运行特定任务。我通过将我的服务器日期和时间设置为该月最后一天的 11:59 来测试这项工作,启动服务器并观察任务在它变成 12:00 时运行,但我担心的情况是服务器(无论出于何种原因)可能不会在本月第一天的午夜运行。

我原以为 Quartz 中的 misfire 处理会解决这个问题,但也许我错了?

谁能告诉我如何处理这个问题?我真的不想创建每“x”秒/分钟/小时运行一次的作业,并检查是否需要运行该作业(如果可以避免的话)。

我也很好奇为什么我没有看到任何与 Quartz 相关的日志记录信息,但这是次要问题。

这是我的任务 Spring 配置:

<bean id="schedulerService" class="com.bah.pams.service.scheduler.SchedulerService">
    <property name="surveyResponseDao" ref="surveyResponseDao"/>
    <property name="organizationDao" ref="organizationDao"/>
</bean>

<bean name="createSurveyResponsesJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.bah.pams.service.scheduler.jobs.CreateSurveyResponsesJob"/>
    <property name="jobDataAsMap">
        <map>
            <entry key="schedulerService" value-ref="schedulerService"/>
        </map>
    </property>
</bean>
<!-- Cron Trigger -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="createSurveyResponsesJob"/>
    <property name="cronExpression" value="0 0 0 1 * ? *"/>
    <!--if the server is down at midnight on 1st of month, run this job as soon as it starts up next -->
    <property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_FIRE_ONCE_NOW"/>
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

    <property name="autoStartup" value="true"/>

    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
            <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
        </props>
    </property>
    <property name="jobDetails">
        <list>
            <ref bean="createSurveyResponsesJob"/>
        </list>
    </property>

    <property name="triggers">
        <list>
            <ref bean="cronTrigger"/>
        </list>
    </property>
</bean>

最佳答案

MISFIRE_INSTRUCTION_FIRE_ONCE_NOW 用于您提到的目的,如果您怀疑服务器关闭,您绝对应该将作业保留在 JVM 内存之外(例如:使用 JDBCJobStore 而不是 RAMJobStore)。

RAMJobStore 快速且轻量级,但在进程终止时所有调度信息都会丢失。

http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigRAMJobStore

JDBCJobStore 用于在关系数据库中存储计划信息(作业、触发器和日历)。

http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJobStoreTX

希望对您有所帮助。

关于java - 运行错过的 Quartz 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8246401/

相关文章:

java - session Bean 是如何工作的?

java - 如何在布局底部展开对话框?

java - Spring Security 一种角色不同权限

java - 在 Spring Boot 应用程序的应用程序属性文件中使用 Jenkins 变量

grails - IntelliJ IDEA 不会加载在我的磁盘上找到的 Groovy

elasticsearch - 如何在脚本分数中使用字段的最大分数 - ElasticSearch

Java & 安卓 : Best way to create a dynamically expandable list of EditTexts in an activity?

Java 完整错误银行账户类

java - 尝试获取资源路径会导致 NullPointerExceptions

java - 通过一个 spring-rabbit 服务中的一个消费者同时处理多个 amqp 消息