集群环境中的Spring Scheduler

时间:2016-05-27 18:13:47

标签: java spring cluster-computing scheduler

我正在使用Spring调度程序使用@Scheduled批注来安排运行文件生成服务的作业。该应用程序部署在集群环境中的4个独立的tomcat节点上,用于负载平衡和故障转移。因此,服务预定5次,这是从未预料到的。 有没有办法将调度程序配置为仅在当前节点上运行?

有一种方法使用数据库来确定当前的活动节点并为该特定实例调用调度程序here

另一种方法是使用quartz scheduler

由于我无法对已部署的应用程序进行重大更改,是否有一个简单的解决方案?请指教。

2 个答案:

答案 0 :(得分:4)

您可以使用ShedLock项目。您只需注释执行时应锁定的任务

@Scheduled( ... )
@SchedulerLock(name = "scheduledTaskName")
public void scheduledTask() {
   // do something
}

配置Spring和LockProvider(当前支持SQL和Mongo)

@Bean
public TaskScheduler taskScheduler(LockProvider lockProvider) {
   return SpringLockableTaskSchedulerFactory
             .newLockableTaskScheduler(poolSize, lockProvider);
}

答案 1 :(得分:2)

您还可以使用dlock在多个节点上仅执行一次计划任务。您只需执行以下操作即可。

<div id="shop">
  {{# each products}}
  {{/each}}
</div>

有关使用的信息,请参见article