Scheduled分布式使用schedlock(mysql for update)锁
前言
小型分布式项目使用@scheuled加corn表达式来实现定时任务,因为只有两个服务器,所有没有使用定时任务框架,但是为了任务只执行一次,所有使用了schedlock锁。
一、开启注解
启动类上添加注解 @EnableScheduling。
二、创建数据库表
CREATE TABLE `shedlock` (
`name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '锁名称',
`lock_until` timestamp(3) NULL DEFAULT NULL COMMENT '释放锁时间',
`locked_at` timestamp(3) NULL DEFAULT NULL COMMENT ' 获取锁时间',
`locked_by` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '锁提供者',
PRIMARY KEY (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
二、添加配置文件
下面展示一些 内联代码片
。
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* 定时任务锁配置
*
* @author zjtang9
* @date 2022/05/21
*/
@Component
public class ShedLockConfig {
@Resource
private DataSource dataSource;
@Bean
private LockProvider lockProvider() {
return new JdbcTemplateLockProvider(dataSource);
}
}
三、corn表达式上使用注解 @SchedulerLock(name = “唯一任务名”)
这样就可以了
总结
简单好用 @SchedulerLock 注解还有其他属性,可以根据自己项目需求自己添加。