石英集群模式只运行一个任务

时间:2016-06-01 17:56:34

标签: java quartz-scheduler

我有两个必须在群集模式下运行的石英应用程序,所以我有两个罐子。当我运行这两个jar(java -jar)时,只有一个进程似乎正在工作,另一个似乎处于待机状态并且什么都不做,只有在我杀死其他进程时才开始工作。我需要两个进程以集群模式运行。

这是我的配置:

private Properties getProperties() {
    final Properties quartzProperties = new Properties();
    quartzProperties.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
    quartzProperties.put("org.quartz.jobStore.isClustered", "true");

    quartzProperties.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
    quartzProperties.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
    quartzProperties.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
    quartzProperties.put("org.quartz.threadPool.threadCount", "25");
    quartzProperties.put("org.quartz.scheduler.instanceId", "AUTO");
    quartzProperties.put("org.quartz.scheduler.instanceName", "qrtz");

    quartzProperties.put("org.quartz.threadPool.threadPriority", "5");
    quartzProperties.put("org.quartz.jobStore.clusterCheckinInterval","10000");
    quartzProperties.put("org.quartz.jobStore.useProperties", "false");


    quartzProperties.put("org.quartz.jobStore.dataSource", "quartzDS");
    quartzProperties.put("org.quartz.dataSource.quartzDS.URL", environment.getRequiredProperty("org.quartz.dataSource.quartzDS.URL"));
    quartzProperties.put("org.quartz.dataSource.quartzDS.user", environment.getRequiredProperty("org.quartz.dataSource.quartzDS.user"));
    quartzProperties.put("org.quartz.dataSource.quartzDS.password", environment.getRequiredProperty("org.quartz.dataSource.quartzDS.password"));
    quartzProperties.put("org.quartz.dataSource.quartzDS.maxConnections", "5");
    quartzProperties.put("org.quartz.dataSource.quartzDS.validationQuery", "select 0 from dual");
    quartzProperties.put("org.quartz.dataSource.quartzDS.driver", environment.getRequiredProperty("org.quartz.dataSource.quartzDS.driver"));
    return quartzProperties;
}

1 个答案:

答案 0 :(得分:1)

TL; TR:您的问题来自Quartz Scheduler本身,无法改变其行为。

为了让您了解原因,我必须向您解释Quartz集群模式的行为方式。我们将以您的情况为例。

启动两个应用程序,每个应用程序运行一个通过数据库同步的Quartz实例。您正在安排的每个作业都存储在数据库中,其中包含处理数据,例如"上次作业运行","运行作业的最后一个实例"等等。每个Quartz实例定期扫描数据库工作可以解雇和解雇尽可能多的工作。

事情是,如果你没有足够的负载,你的一个节点将始终在另一个节点之前扫描数据库并承担所有负载。

要查看其他实例是否正常工作,您必须关闭或备用第一个实例或增加群集负载。

您可以在此配置的唯一内容是每个节点的线程池大小:请参阅http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering.html