Spring Scheduled Task 在集群环境中运行

标签 spring spring-scheduled

我正在编写一个具有每 60 秒执行一次的 cron 作业的应用程序。该应用程序配置为在需要时扩展到多个实例。我只想每 60 秒在 1 个实例上执行任务(在任何节点上)。开箱即用我找不到解决方案,我很惊讶以前没有被问过多次。我正在使用 Spring 4.1.6。

    <task:scheduled-tasks>
        <task:scheduled ref="beanName" method="execute" cron="0/60 * * * * *"/>
    </task:scheduled-tasks>

最佳答案

有一个ShedLock正是为这个目的服务的项目。您只需注释执行时应锁定的任务

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

配置 Spring 和 LockProvider

@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m")
class MySpringConfiguration {
    ...
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
       return new JdbcTemplateLockProvider(dataSource);
    }
    ...
}

关于Spring Scheduled Task 在集群环境中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31288810/

相关文章:

java - 无法在 Springboot/Hibernate 中保存具有 OneToMany 关系的子对象

java - LazyInitializationException 尽管有 Spring 事务?

java - @Scheduled 在服务器启动时被调用

java - 为什么我的计划作业没有并行执行

hibernate - Spring4 @Scheduled @Transaction 抛出多个数据源刷新时没有事务正在进行

java - 如何重新启动服务器关闭后动态创建的 Quartz 作业

java - 使用 spring-security 登录 Facebook

java - JPA 多持久性单元错误

java - Quartz Job 和 Spring 调度任务的区别?

java - @Scheduled 不适用于 Javaconfig