Grails Quartz Clustering - 调度程序仍然独立运行

时间:2014-12-10 08:16:55

标签: tomcat grails quartz-scheduler load-balancing failover

我的问题是,当我在集群模式下运行两个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()
    }
}

1 个答案:

答案 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