ShedLock解决多节点集群定时任务并发

   日期:2020-11-11     浏览:133    评论:0    
核心提示:场景描述:最近的项目中有用到定时任务的场景,涉及到数据备份,由于多节点集群部署,导致@Scheduled所创建定时任务发生并发。之前已经用过Quartz的单机使用方法,后面研究过Quartz的解决集群并发以后还是决定采用ShedLock,相对来说比较轻量级,毕竟我们的业务场景只需要解决同一时间集群并发。ShedLock适用场景:保证多个一个定时任务在多个服务实例之间最多只执行一次。配置相对来说最简单,对TaskName加锁的方式来实现,只需要数据库中新建一张表记录相关锁信息。Quarzt的配置较为复杂

场景描述:

最近的项目中有用到定时任务的场景,涉及到数据备份,由于多节点集群部署,导致@Scheduled所创建定时任务发生并发。之前已经用过Quartz的单机使用方法,后面研究过Quartz的解决集群并发以后还是决定采用ShedLock,相对来说比较轻量级,毕竟我们的业务场景只需要解决同一时间集群并发。

ShedLock适用场景:

保证多个一个定时任务在多个服务实例之间最多只执行一次。配置相对来说最简单,对TaskName加锁的方式来实现,只需要数据库中新建一张表记录相关锁信息。Quarzt的配置较为复杂但是也更灵活。后面有时间的话会出Quartz多节点集权并发的使用。

相关依赖:

<!-- shedlock -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc-template</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

Component注入:

@Component
public class ShedLockConfig { 
    @Bean
    public LockProvider lockProvider(DataSource dataSource) { 
        return new JdbcTemplateLockProvider(dataSource);
    }

    @Bean
    public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) { 
        return ScheduledLockConfigurationBuilder.withLockProvider(lockProvider)
                .withPoolSize(10)
                .withDefaultLockAtMostFor(Duration.ofMinutes(10))
                .build();
    }
}

mysql建表

CREATE TABLE shedlock(
name VARCHAr(64) comment ‘锁名称(name必须是主键)’,
lock_until TIMESTAMP(3) NULL comment ‘释放锁时间’,
locked_at TIMESTAMP(3) NULL comment ‘获取锁时间’,
locked_by VARCHAr(255) comment ‘锁提供者’,
PRIMARY KEY (name)
) ;

oracle 建表

CREATE TABLE SHEDLOCK (
name VARCHAr2(64 CHAR),
lock_until TIMESTAMP,
locked_at TIMESTAMP,
locked_by VARCHAr2(255 CHAR),
PRIMARY KEY (name)
);

项目注解的形式使用

启动类

@SpringBootApplication
@EnableScheduling
// 指定锁持有最大时间,会被具体的方法上相同注解覆盖
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class QuartzSpringbootMysqlApplication { 

   public static void main(String[] args) { 
      SpringApplication.run(QuartzSpringbootMysqlApplication.class, args);
   }
}

业务代码


@SchedulerLock(name = "testJob",lockAtLeastFor = 2000)
@Scheduled(cron = "1 1 1 * * *")
public void testJob(){ 
    logger.info(Thread.currentThread().getName()+ ":"+new Date());
}

数据库中表数据

提示:
可以一个项目2个端口启动模拟多节点集群并发,具体操作百度。

ShedLock GitHub 相关文档

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服