【问题标题】:quartz cluster mode only runs one task石英集群模式只运行一个任务
【发布时间】:2016-06-01 17:56:34
【问题描述】:

我有两个必须在集群模式下运行的石英应用程序,所以我有两个罐子。当我运行这两个 jars (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;
}

【问题讨论】:

    标签: java quartz-scheduler


    【解决方案1】:

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

    为了让你明白为什么,我必须解释一下 Quartz 集群模式的行为。我们将以您的情况为例。

    您启动两个应用程序,每个应用程序运行一个通过数据库同步的 Quartz 实例。您正在调度的每个作业都存储在数据库中,其中包含处理数据,例如“作业上次运行时间”、“运行作业的最后一个实例”等。每个 Quartz 实例定期扫描数据库以查找要触发的作业并触发尽可能多的作业罐头。

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

    要看到您的另一个实例正常工作,您必须关闭或待机第一个实例或增加集群的负载。

    你唯一可以配置的就是每个节点的线程池大小:见http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多