我有两个必须在群集模式下运行的石英应用程序,所以我有两个罐子。当我运行这两个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;
}
答案 0 :(得分:1)
TL; TR:您的问题来自Quartz Scheduler本身,无法改变其行为。
为了让您了解原因,我必须向您解释Quartz集群模式的行为方式。我们将以您的情况为例。
启动两个应用程序,每个应用程序运行一个通过数据库同步的Quartz实例。您正在安排的每个作业都存储在数据库中,其中包含处理数据,例如"上次作业运行","运行作业的最后一个实例"等等。每个Quartz实例定期扫描数据库工作可以解雇和解雇尽可能多的工作。
事情是,如果你没有足够的负载,你的一个节点将始终在另一个节点之前扫描数据库并承担所有负载。
要查看其他实例是否正常工作,您必须关闭或备用第一个实例或增加群集负载。
您可以在此配置的唯一内容是每个节点的线程池大小:请参阅http://www.quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering.html