用shedlock实现分布式定时任务锁
2024-09-02 06:56:33
添加包
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>
2.2
.
0
</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>
2.2
.
0
</version>
</dependency>
添加表
CREATE TABLE `shedlock` (
`name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
`lock_until` timestamp(3) NULL DEFAULT NULL,
`locked_at` timestamp(3) NULL DEFAULT NULL,
`locked_by` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
添加config
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import net.javacrumbs.shedlock.spring.ScheduledLockConfiguration;
import net.javacrumbs.shedlock.spring.ScheduledLockConfigurationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling; import javax.sql.DataSource;
import java.time.Duration; @Configuration
@EnableScheduling
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();
}
}
具体的定时任务
import net.javacrumbs.shedlock.core.SchedulerLock;
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; @Component
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S") //重点地方
public class MarkRefreshScheduler { private final static Logger logger = LoggerFactory.getLogger(MarkRefreshScheduler.class); //每周一早上5点执行一次,用户的热度值和hot标识归零
@Scheduled(cron = "0 0/2 * * * ? ")
@SchedulerLock(name = "headNumCronName", lockAtMostFor = 5 * 1000, lockAtLeastFor = 5 * 1000)//重点地方
public void refreshHotSumAndIsOnTop() {
logger.info("begin refreshHotSumAndIsOnTop...");
//do something
logger.info("begin refreshHotSumAndIsOnTop..."); }
}
结果
通过修改数据库表中的数据实现锁
里面有四个字段
主键name:每个定时任务的一个名字
locked_at:锁的开始时间
lock_until:锁的结束时间
再定时开始时,会更新这两个时间,在时间之内的定时是不会被执行的
最新文章
- phpexcel读取输出操作
- 安装jdk
- 常用的Meta标签写法和作用
- python---filecmp
- tableview调用reloadData()之后界面不刷新显示
- 使用keil建立标准STM32工程模版(图文详细版!)
- apache开源项目-- OODT
- activity的生命周期详解
- Python+Django+SAE系列教程11-----request/pose/get/表单
- RecyclerView0基于使用
- 在React+Babel+Webpack环境中使用ESLint
- 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本
- Spring与Mybatis整合
- docker 安装mysql
- Python3 与 C# 扩展之~基础拓展
- Json&;xml分析~
- 第一条:了解Objective-C语言的起源
- 1.print()与input()
- Linux系统中切换用户身份su与sudo的用法与实例
- Kafka设计解析(六)Kafka高性能架构之道