有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Quartz和Spring群集化但不持久?

在我的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>

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

有什么想法吗?我只想使用DB进行集群,而不是其他任何类型的持久化


共 (2) 个答案

  1. # 1 楼答案

    我在clustered quartz 2上遇到了类似的问题。我不是在跑骆驼,但这是同样的问题

    1)在集群环境中,我不可能通过简单地从spring上下文xml中删除作业/触发器来删除作业

    2)由于数据库存储作业/触发器信息,因此如果要添加或修改作业,跨服务器的滚动部署会出现问题。服务器可以在作业实现部署到应用服务器之前开始运行作业,除非在部署更改之前关闭所有服务器

    为了解决这个问题,我想出了一个非常简单的解决方案。作为构建过程的一部分,我们已经在构建工件中捕获并存储了唯一的构建版本+编号w/(使用gradle变量替换)。为了解决这个问题,我们只需让调度器的名称包含唯一的构建版本+编号。这将导致最新的一组jobs+触发器以新调度器的名称添加到数据库中,一旦滚动部署完成,所有服务器都将以新名称运行。这解决了删除问题,也解决了滚动部署问题。如果所有额外的调度器名称在数据库中成为问题,那么可以编写一些东西来清理它们(如果需要)

  2. # 2 楼答案

    这是一篇古老的帖子,但为了那些需要解决方案的人的利益,这里就是。为属性“overwriteExistingJobs”指定“true”。您必须重新启动服务器,每次重新启动时,旧作业都将被删除。我不知道这在旧版本的quartz scheduler中是否可行,我使用的是2.1.7