我的问题是,当我在集群模式下运行两个tomcat实例时,调度程序每10秒调用一次
println "called: " + new Date()
然后每个tomcat实例都会独立调用该打印。如果我设置Quartz配置来处理集群,那么它不应该是那样的。
例如,当tomcat A在8:00:00启动而tomcat B在8:00:05启动时,应该在8:00:10在tomcat A中调用调度程序,而Tomcat B应该不< / strong>在8:00:15致电。但在我的情况下,调度程序在8:00:10在tomcat A中触发,在8:00:15在tomcat B触发,然后是8:00:20的tomcat A和8:00:25的tomcat B等等。看起来我的调度程序是独立运行的,而不是同步的。
这是正确的行为还是我想念的东西?
这是我的配置
quartz.properties
# http://stackoverflow.com/questions/7479438/grails-clustering-quartz-jobs-sample-code-and-config-desired
org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = HartakuClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = quartzDataSource
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 5000
org.quartz.jobStore.useProperties = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
# Detect the jvm shutdown and call shutdown on the scheduler
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true
org.quartz.dataSource.quartzDataSource.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.quartzDataSource.URL = jdbc:mysql://localhost/latihanclust?useUnicode=yes&characterEncoding=UTF-8
org.quartz.dataSource.quartzDataSource.user = root
org.quartz.dataSource.quartzDataSource.password =
org.quartz.dataSource.quartzDataSource.maxConnections = 8
QuartzConfig.groovy
quartz {
autoStartup = true
jdbcStore = true
waitForJobsToCompleteOnShutdown = true
exposeSchedulerInRepository = false
props {
scheduler.skipUpdateCheck = true
}
}
environments {
test {
quartz {
autoStartup = false
}
}
}
TestingJob.groovy
class TestingJob {
static triggers = {
simple startDelay:10000, repeatInterval: 10000l // execute job once in 10 seconds
}
def execute() {
println "called: " + new Date()
}
}
答案 0 :(得分:-2)
为什么要使用Quartz调度程序进行聚类?你想要达到什么目标?
在我看来,群集应该由1个主服务器和两个或多个从服务器实例完成。使用Apache / Nginx代理转发很容易配置。主服务器位于前端,奴隶实例位于该主服务器后面。主服务器(如Apache / Nginx)具有在从属实例之间进行负载平衡或故障转移的角色。
所以,计划是这样的: 用户访问HTTP Web端口80 - &gt; Apache / Nginx Server&lt; ---&gt;代理转发多个Tomcat实例(10.1.14.20:8080,10.1.14.21:8080,10.1.14.22:8080等)。
Apache / Nginx服务器智能足以检测从属实例。如果一个从属实例关闭,前端Web服务器(Apache / Nginx)继续使用仍在运行的其他从属实例。
参考: https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing