spring - Quartz Clustering - 服务器启动时触发重复

标签 spring cluster-computing quartz-scheduler crontrigger

在集群设置(使用 JDBC 数据存储)中使用 Quartz 2.1.6 和 Spring 3.1 时,我们遇到了一个问题。
当前上下文:

  • 作业和 CRON 触发器在 spring 配置文件中定义(见下文)
  • 在 SchedulerFactoryBean 中 overwriteExistingJobs 属性设置为 true,因此我们不会在每次部署时将新的作业定义添加到数据库中。
  • 但是,每次在集群中部署之后,似乎每个节点都会重新创建触发器数据。例如,如果我们有 2 个触发器指向 1 个作业和 4 个节点,那么在集群部署之后,DB 有 1 个作业定义和 4x2 个触发器。每次重新部署都会添加 4x2 触发器。

  • 这种行为正常吗?如果是:我们如何告诉 Quartz 不要在每次部署时重新创建触发器数据? (或覆盖该数据,就像乔布斯一样)
    <bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.etc.MyJob" />
    </bean>
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
        p:waitForJobsToCompleteOnShutdown="false" lazy-init="false">
    
        <property name="dataSource" ref="myDataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="overwriteExistingJobs" value="true" />
        <property name="autoStartup" value="true" />
        <property name="jobFactory">
                    <bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory"/>
                </property>
        <property name="triggers">
            <list>
                <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" p:cronExpression="0 0 0 * * ?"                   p:misfireInstruction="2">
                    <property name="jobDetail" ref="myJob" />
                </bean>
                <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "
                    p:cronExpression="0 0 20 * * ?"
                    p:misfireInstruction="2">
                    <property name="jobDetail" ref="myJob" />
                </bean>
            </list>
        </property>
        <property name="quartzProperties">
            <props>
                <prop key="org.quartz.scheduler.instanceName">fsbu_scheduler</prop>
                <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
    
                <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
                <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate
                </prop>
                <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE
                </prop>
                <prop key="org.quartz.jobStore.tablePrefix">fsqrz_</prop>
                <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop>
                <prop key="org.quartz.jobStore.isClustered">true</prop>
                <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
                <prop key="org.quartz.threadPool.threadCount">3</prop>
                <prop key="org.quartz.plugin.triggHistory.class">org.quartz.plugins.history.LoggingTriggerHistoryPlugin
                </prop>
                <prop key="org.quartz.plugin.triggHistory.triggerFiredMessage">Trigger {1}.{0} fired job {6}.{5} at {4, date,
                    yyyy-MM-dd HH:mm:ss}
                </prop>
                <prop key="org.quartz.plugin.triggHistory.triggerCompleteMessage">Trigger {1}.{0} completed firing job {6}.{5} at {4,
                    date, yyyy-MM-dd HH:mm:ss} with resulting trigger instruction code
                    {9}
                </prop>
            </props>
        </property>
    </bean>
    

    最佳答案

    每个触发器的 bean 定义没有“ name ”属性。因此,Spring 的 CronTriggerFactory 会在每次部署时动态生成一个新的触发器名称,这就是造成附加效果的原因(不同名称的触发器不会被覆盖)。

    添加 名称="..."每个触发器定义的唯一值解决了这个问题。

    关于spring - Quartz Clustering - 服务器启动时触发重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987972/

    相关文章:

    java - Spring Data 存储库实际上是如何实现的?

    spring - 坟墓 : Error listenerStart

    java - Spring mvc 测试+mockito。 @ModelAttribute 空指针

    java - Wildfly 9 AS中Infinispan缓存的实现(考虑集群)

    java - 什么是 quartz 默认线程数

    java - 找不到适合响应类型和内容类型的 HttpMessageConverter

    amazon-ec2 - EC2 中的 2 个不同的可用区是充当 WAN 还是 LAN?

    linux - 扭矩嵌套/连续 qsub 调用

    java - Quartz Scheduler (cron) 能否在同一执行时间调度多个作业?

    java - quartz 中的 thread.sleep 必须与我的日程安排时间相匹配吗?