1.ShedLock只做一件事。它确保您的计划任务最多同时执行一次。如果正在一个节点上执行任务,它将获取一个锁,以防止从另一个节点(或线程)执行相同的任务。请注意,如果一个任务已在一个节点上执行,则其他节点上的执行不会等待,只会跳过它。
目前,支持通过Mongo,JDBC数据库,Redis,Hazelcast或ZooKeeper协调的Spring计划任务。更多的调度和协调机制以及未来的预期。
ShedLock不是分布式调度程序
请注意,ShedLock不是,也永远不会是完整的调度程序,它只是一个锁定。如果您需要分布式调度程序,请使用其他项目。ShedLock旨在用于您没有准备好并行执行的计划任务但可以安全地重复执行的情况。例如,如果任务从数据库中获取记录,则处理它们并在最后将它们标记为已处理,而不使用任何事务。在这种情况下,ShedLock可能适合您。
2.属性
@SchedulerLock注解有name ,lockAtMostFor ,lockAtLeastFor 三个属性
name :锁名,名称相同的定时器,每次只会执行一个,name类似分组
lockAtMostFor:该属性指定在执行节点死亡时应保留锁的时间。这只是一个后备,在正常情况下,锁定会在任务完成后立即释放,
lockAtLeastFor属性,指定保留锁的最短时间。主要目的是在任务非常短的且节点之间存在时钟差异的情况下防止多个节点执行。这个属性是锁的持有时间。设置了多少就一定会持有多长时间,再次期间,下一次任务执行时,其他节点包括它本身是不会执行任务的。
3.示例,
1.pom:
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>1.1.1</version>
</dependency>
2.代码
@Service
public class TestScheduled {
private final Logger log = LoggerFactory.getLogger(TestScheduled.class);
@Autowired
private ShceDuledService shceDuledService;
private static final int FOURTEEN_MIN = 1 * 9 * 1000 ;
@Scheduled(cron="0/10 * * * * ?")
@SchedulerLock(name = "scheduledTaskName",lockAtMostFor = FOURTEEN_MIN,lockAtLeastFor = FOURTEEN_MIN)
public void test(){
log.info("shedlockl执行test"+System.currentTimeMillis());
shceDuledService.test();
}
}
3.配置类
@Configuration
@EnableScheduling
public class ShedlockConfig {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}
//指定数据表
/*@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource,"test");
}*/
@Bean
public ScheduledLockConfiguration scheduledLockConfiguration(LockProvider lockProvider) {
return ScheduledLockConfigurationBuilder.withLockProvider(lockProvider)
.withPoolSize(10)
.withDefaultLockAtMostFor(Duration.ofMinutes(10))
.build();
}
}
4.数据库,jdbc数据库直接新建一个表就好,一般默认为
CREATE TABLE shedlock(
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
)
这样基本完成了,我们也可以指定表,指定表可以如下配置
ShedLock github地址为:https://github.com/lukas-krecan/ShedLock
个人demo地址:https://github.com/hxf044/ShedLock