Java 群集石英实例是否计划重复作业?

Java 群集石英实例是否计划重复作业?,java,quartz-scheduler,load-balancing,Java,Quartz Scheduler,Load Balancing,我有一个Tomcat web应用程序,它使用quartz框架安排作业。它作为RAM Jobstore上的一个实例运行。最近,我们计划迁移到JDBCJobstore并建立一个集群,这样,如果一个实例失败,另一个实例将能够运行该作业 以下是我的问题: 我的we应用程序A将扫描与业务相关的数据库表,并在启动期间和之后每10分钟安排一次quartz作业。如果我在两个不同的tomcat实例上部署两个A应用程序,那么将通过Quartz调度两组重复作业 我应该如何解决这个问题?我是否需要将调度作业的代码部分提

我有一个Tomcat web应用程序,它使用quartz框架安排作业。它作为RAM Jobstore上的一个实例运行。最近,我们计划迁移到JDBCJobstore并建立一个集群,这样,如果一个实例失败,另一个实例将能够运行该作业

以下是我的问题:

我的we应用程序A将扫描与业务相关的数据库表,并在启动期间和之后每10分钟安排一次quartz作业。如果我在两个不同的tomcat实例上部署两个A应用程序,那么将通过Quartz调度两组重复作业

我应该如何解决这个问题?我是否需要将调度作业的代码部分提取到单独的应用程序中,并确保只部署1个实例,以便只调度1组作业?但问题是——如果这个实例失败了怎么办?在这种情况下,如何实现故障转移?

您可以在群集quartz实例中将任务“扫描业务相关数据库表,并在启动期间和启动后每10分钟安排一次quartz作业”本身设置为cron任务

下面是一个基于spring的解决方案。尽管您可以使用该思想轻松地转换为非基于spring的解决方案

每十分钟设置一个cron触发器

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="runMeJob" />
    <property name="cronExpression" value="0 */10 * * * ?" />
</bean>

安排一份工作。在这里,您需要一个spring上下文中的类实例。这个类实例将有一个公共方法,在触发触发器时调用该方法。在此方法中,您将编写任务来扫描数据库并安排这些作业

<bean id="cronJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="yourObject" />
    <property name="targetMethod" value="methodOfThatObject" />     
</bean>

在计划程序中配置触发器和作业

<!--this should be your clustered quartz scheduler-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobDetails">
        <list>
            <ref bean="cronJob" />
        </list>
    </property>

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


?标记表示数据挖掘问题。您的问题是关于web服务器的负载平衡。如果您的quartz处于群集模式,则不会有重复作业。只有一个实例将负责执行它。因此,如果应用程序处于集群模式,则可以有多个实例。但是,在同一集群中,您将有多个实例,它们将尝试安排重复的作业,对吗?如何确保只有一个实例在多个节点内执行调度?谢谢当我们需要多个quartz实例以及它们之间的协调以便只有一个实例执行作业时,需要群集quartz调度程序设置。如果您是通过cron调度作业,则此cron调度任务本身可以作为作业添加到此群集调度程序中。假设每十分钟您需要扫描一些数据存储(如mysql)并安排作业。在这种情况下,假设集群中有4个节点,只有一个实例将执行此调度cron任务。同样,作业执行也可以在集群中的任何节点上进行!以前我没有意识到作业调度任务将只由一个实例执行,就像作业本身一样。只有在预先配置时才是这样,对吗?换句话说,如果我以编程方式调用scheduler.scheduleJob,那么这个调用将由多个节点运行,对吗?我还没有尝试过这个场景。但我认为编程不会有任何问题,因为即使我们通过xml配置这些作业,框架实际上也是以编程的方式完成的。如果希望以编程方式完成,您可能需要测试并确保。