石英和弹簧 - 聚集但不持久?

Jas*_*tos 10 java spring load-balancing quartz-scheduler

在我的Spring应用程序中,我使用的SchedulerFactoryBean是与Quartz集成.我们将要有群集的Tomcat实例,因此我希望拥有一个集群的Quartz环境,这样相同的作业就不会在不同的Web服务器上同时运行.

为此,我的app-context.xml内容如下:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger"/>
            <ref bean="simpleTrigger" />
        </list>
    </property>
    <property name="dataSource" ref="dataSource"/>
    <property name="overwriteExistingJobs" value="true"/>
    <!-- found in applicationContext-data.xml -->
    <property name="applicationContextSchedulerContextKey" value="applicationContext"/>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">SomeBatchScheduler</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.simpl.RAMJobStore</prop>-->
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
            <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</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">25</prop>
            <prop key="org.quartz.threadPool.threadPriority">5</prop>
        </props>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

一切都运行良好,除了当我尝试删除或更改触发器,然后重新启动我的应用程序时,旧的触发器仍然保留在数据库中,仍然运行.我不希望这样,我只是希望在app停止(或重新启动)时删除它们.我将overwriteExistingJobs属性的值设置为true,因为我认为这就是它所做的.

有任何想法吗?我只想使用数据库进行聚类,而不是任何类型的持久性.

小智 2

我已经对这个主题进行了研究,这是 Quartz 中的一个众所周知的错误,我在他们的论坛上发现了一些帖子。为了解决这个问题,我创建了一个 bean 来删除 Quartz 表中的所有记录。你可以在你的 Quartz bean 加载之前调用这个 bean(在你的 Scheduler bean 上添加一个“depends-on”),当你的 spring 上下文被销毁时(确保数据库连接池仍然打开),或者通过某种形式手动调用用户界面。工作组也存在一个错误,请不要感到惊讶。我的第一个修复是创建一个带有该修复的客户 Quartz jar,但每当他们发布新版本时,升级就变得非常困难(我当时使用的是 1.4 或 1.5 - 不太记得了)。

  • 这不是一个错误。这是对读取 XML 文件的插件的作用的误解。它所做的只是读取文件并添加文件中指定的作业/触发器。这就是它运行时所做的全部事情。它没有声称做除此之外的任何事情(例如,首先清除调度程序中的所有数据)。 (3认同)