【问题标题】:Spring Scheduler in Clustered environment集群环境中的 Spring 调度程序
【发布时间】:2016-05-27 18:13:46
【问题描述】:
我正在使用 Spring 调度程序,使用 @Scheduled 注解来调度运行文件生成服务的作业。该应用程序部署在集群环境中 5 个独立的 tomcat 节点上,用于负载平衡和故障转移。正因为如此,服务被安排了 5 次,这是从未预料到的。
有没有办法将调度程序配置为仅在当前节点上运行?
有一种方法使用数据库找出当前活动节点并为该特定实例调用调度程序here
另一种方法是使用quartz scheduler
由于我无法对已部署的应用程序进行重大更改,是否有简单的解决方案?请指教。
【问题讨论】:
标签:
java
spring
cluster-computing
scheduler
【解决方案1】:
您可以使用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);
}
【解决方案2】:
您还可以使用dlock 在多个节点上只执行一次计划任务。您可以简单地执行以下操作。
@Scheduled(cron = "30 30 3 * * *")
@TryLock(name = "jobLock", owner = SERVER_NAME, lockFor = THREE_MINUTES)
public void runJobsOnce() {
List<Job> jobs = jobService.getJobs();
for(Job job: jobs){
runJob(job);
}
}
请参阅article 了解如何使用它。