我正在开发定期服务。
该应用程序是使用 JDK 1.6、Spring Framework 2.5.6 和 Quartz 1.8.4 开发的,用于调度作业。
我有两台使用 WebLogic Server 10.3.5 的集群服务器。
有时,石英的调度似乎变得疯狂。分析它发生的条件,集群服务器之间似乎存在大于一秒的时钟“不同步”。然而这种不同步并不总是由于服务器的系统时间,有时即使机器的时钟同步,JVM也会引入一点“延迟”。
有没有人遇到过同样的问题?有没有办法解决它?
提前致谢
我正在开发定期服务。
该应用程序是使用 JDK 1.6、Spring Framework 2.5.6 和 Quartz 1.8.4 开发的,用于调度作业。
我有两台使用 WebLogic Server 10.3.5 的集群服务器。
有时,石英的调度似乎变得疯狂。分析它发生的条件,集群服务器之间似乎存在大于一秒的时钟“不同步”。然而这种不同步并不总是由于服务器的系统时间,有时即使机器的时钟同步,JVM也会引入一点“延迟”。
有没有人遇到过同样的问题?有没有办法解决它?
提前致谢
在 2.2.1 版的 Oracle 上使用 JDBC-JobStore 时,我遇到了同样的问题。
就我而言,我在单个节点上运行 Quartz。但是,我注意到数据库机器与运行 Quartz 的节点没有时间同步。
我在数据库机器和运行 Quartz 的机器上都激活了 ntpd,几分钟后问题就消失了。
这个问题最常发生是因为集群节点中的时间不同步。但是,它也可能是由于应用程序与 DB 的连接不稳定造成的。这种连接问题可能是由于网络问题(如果应用服务器和数据库服务器在不同的机器上)或性能问题(数据库服务器由于某种原因处理请求非常慢)引起的。
在这种情况下,可以通过增加 org.quartz.jobStore.clusterCheckinInterval 值来减少出现此问题的机会。
我正在使用 Quartz 2.2.1,每当发生集群恢复时,我都会注意到一个奇怪的行为。
例如,即使机器已与 ntpdate 服务同步,我也会在集群实例恢复时收到以下消息:
org.quartz.impl.jdbcjobstore.JobStoreSupport findFailedInstances “<em>此调度程序实例 () 仍处于活动状态,但已被集群中的另一个实例恢复。这可能会导致不一致的行为”。
这里说解决方案是:“同步所有集群节点上的时间,然后重新启动集群。消息不应再出现在日志中。”
由于每台机器都是同步的,这种“延迟”可能是由 JVM 引入的?我不知道...:(
我遇到了同样的问题。首先,您应该检查集群的日志和时间同步。
标记是日志中的消息:
08-02-2018 17:13:49.926 [QuartzScheduler_schedulerService-pc6061518092456074_ClusterManager] INFO o.s.s.quartz.LocalDataSourceJobStore - ClusterManager: detected 1 failed or restarted instances.
08-02-2018 17:14:06.137 [QuartzScheduler_schedulerService-pc6061518092765988_ClusterManager] WARN o.s.s.quartz.LocalDataSourceJobStore - This scheduler instance (pc6061518092765988) is still active but was recovered by another instance in the cluster.
当第一个节点观察到第二个节点不存在超过org.quartz.jobStore.clusterCheckinInterval
它从集群中注销第二个节点并删除其所有触发器时。
看一下同步算法:org.quartz.impl.jdbcjobstore.JobStoreSupport.ClusterManager#run
当“签入”需要很长时间时,可能会发生这种情况。
我的解决方案是覆盖org.quartz.impl.jdbcjobstore.JobStoreSupport#calcFailedIfAfter
. 硬编码值“7500L”看起来像宽限期。我将其替换为参数。
注意:如果您使用 SchedulerFactoryBean 注册新的 JobStoreSupport 子类时要小心。Spring强行注册自己的店铺org.springframework.scheduling.quartz.LocalDataSourceJobStore
。
这个问题几乎总是归因于时钟偏差。即使你认为你已经正确设置了 NTPd,仍然会发生一些事情:
所以这个故事的寓意是与 NTPd 同步,但经常这样做并验证它是否确实有效。