第一步:引入shedlock相關(guān)依賴
<!--集成shedlock解決定時(shí)任務(wù)重復(fù)執(zhí)行的問(wèn)題-->
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>2.2.1</version>
</dependency>
ShedLock還可以使用Mongo,Redis,Hazelcast,ZooKeeper等外部存儲(chǔ)進(jìn)行協(xié)調(diào),例如使用redis則引入下面的包
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-redis-spring</artifactId>
<version>${shedlock.redis.version}</version>
</dependency>
第二步:創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),數(shù)據(jù)庫(kù)表的腳本如下:
CREATE TABLE shedlock(
NAME VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (NAME)
)
第三步:添加shedlock配置類(定時(shí)任務(wù)防重復(fù)執(zhí)行的配置類)
package com.sionma.dcxt.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;
/**
* FileName: ShedlockConfig
* Author: SixJR.
* Date: 2023/6/23 21:26:24
* Description: 定時(shí)任務(wù)防重復(fù)執(zhí)行的配置類
* History:
* <author> <time> <version> <desc>
*/
@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();
}
}
第四步:在啟動(dòng)類上添加啟動(dòng)注解,否則SchedulerLock不會(huì)生效
@EnableSchedulerLock(defaultLockAtMostFor = "PT50S")
第五步:在執(zhí)行定時(shí)任務(wù)的方法上面加上你要限制重復(fù)執(zhí)行的注解@SchedulerLock
// 鎖最多保持50秒,最少保持40秒
@SchedulerLock(name = "orderCancelTask", lockAtMostFor = 50 * 1000, lockAtLeastFor = 40 * 1000)
以下是該注解的屬性解釋:
@SchedulerLock注解是Quartz Scheduler中的一個(gè)擴(kuò)展注解,用于控制定時(shí)任務(wù)的并發(fā)執(zhí)行。該注解具有以下屬性:
name:設(shè)置任務(wù)的名稱。該名稱用于標(biāo)識(shí)任務(wù),在Quartz Scheduler中唯一。通常建議為任務(wù)命名一個(gè)具有描述性的名稱。
lockAtMostFor:設(shè)置任務(wù)的最長(zhǎng)鎖定時(shí)間。這個(gè)值表示任務(wù)的最長(zhǎng)允許運(yùn)行時(shí)間。如果任務(wù)在此時(shí)間段內(nèi)未能執(zhí)行完成,Quartz Scheduler將會(huì)中斷任務(wù)運(yùn)行。屬性值是以毫秒為單位的長(zhǎng)整數(shù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-497805.html
lockAtLeastFor:設(shè)置任務(wù)的最短鎖定時(shí)間。這個(gè)值表示任務(wù)被鎖定的最短時(shí)間。即使任務(wù)的業(yè)務(wù)邏輯執(zhí)行時(shí)間很短,也會(huì)保持鎖定指定的時(shí)間。屬性值是以毫秒為單位的長(zhǎng)整數(shù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-497805.html
到了這里,關(guān)于使用shedlock實(shí)現(xiàn)分布式定時(shí)任務(wù)鎖【防止task定時(shí)任務(wù)重復(fù)執(zhí)行】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!