7

我正在开发定期服务。

该应用程序是使用 JDK 1.6、Spring Framework 2.5.6 和 Quartz 1.8.4 开发的,用于调度作业。

我有两台使用 WebLogic Server 10.3.5 的集群服务器。

有时,石英的调度似乎变得疯狂。分析它发生的条件,集群服务器之间似乎存在大于一秒的时钟“不同步”。然而这种不同步并不总是由于服务器的系统时间,有时即使机器的时钟同步,JVM也会引入一点“延迟”。

有没有人遇到过同样的问题?有没有办法解决它?

提前致谢

4

5 回答 5

4

在 2.2.1 版的 Oracle 上使用 JDBC-JobStore 时,我遇到了同样的问题。

就我而言,我在单个节点上运行 Quartz。但是,我注意到数据库机器与运行 Quartz 的节点没有时间同步。

我在数据库机器和运行 Quartz 的机器上都激活了 ntpd,几分钟后问题就消失了。

于 2015-07-24T19:26:39.697 回答
3

这个问题最常发生是因为集群节点中的时间不同步。但是,它也可能是由于应用程序与 DB 的连接不稳定造成的。这种连接问题可能是由于网络问题(如果应用服务器和数据库服务器在不同的机器上)或性能问题(数据库服务器由于某种原因处理请求非常慢)引起的。

在这种情况下,可以通过增加 org.quartz.jobStore.clusterCheckinInterval 值来减少出现此问题的机会。

于 2016-10-20T09:56:12.183 回答
2

我正在使用 Quartz 2.2.1,每当发生集群恢复时,我都会注意到一个奇怪的行为。

例如,即使机器已与 ntpdate 服务同步,我也会在集群实例恢复时收到以下消息:

org.quartz.impl.jdbcjobstore.JobStoreSupport findFailedInstances “<em>此调度程序实例 () 仍处于活动状态,但已被集群中的另一个实例恢复。这可能会导致不一致的行为”。

这里说解决方案是:“同步所有集群节点上的时间,然后重新启动集群。消息不应再出现在日志中。”

由于每台机器都是同步的,这种“延迟”可能是由 JVM 引入的?我不知道...:(

于 2013-11-07T09:00:07.860 回答
2

我遇到了同样的问题。首先,您应该检查集群的日志和时间同步。

标记是日志中的消息:

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

于 2018-02-09T12:22:01.557 回答
2

这个问题几乎总是归因于时钟偏差。即使你认为你已经正确设置了 NTPd,仍然会发生一些事情:

  • 我们认为我们的 NTPd 工作正常(并且配置正确),但在 AWS 上,防火墙阻止了 NTP 端口。UDP 123。同样,这是 UDP 而不是 TCP。
  • 如果您不经常同步,您将累积时钟偏差。众所周知,许多主板上计时器的准确性是不稳定的。因此,随着时间的推移(几天),您会突然收到这些 Quartz 错误。超过 5 分钟,您会遇到许多安全错误,例如 Kerberos。

所以这个故事的寓意是与 NTPd 同步,但经常这样做并验证它是否确实有效。

于 2016-08-30T17:56:33.153 回答