我正在使用Spring调度程序使用@Scheduled批注来安排运行文件生成服务的作业。该应用程序部署在集群环境中的4个独立的tomcat节点上,用于负载平衡和故障转移。因此,服务预定5次,这是从未预料到的。 有没有办法将调度程序配置为仅在当前节点上运行?
有一种方法使用数据库来确定当前的活动节点并为该特定实例调用调度程序here
另一种方法是使用quartz scheduler
由于我无法对已部署的应用程序进行重大更改,是否有一个简单的解决方案?请指教。
答案 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)