場景描述:
最近的專案中有用到定時任務的場景,涉及到資料備份,由于多節點集群部署,導致@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);
}
}
業務代碼
/**
* name 任務名 lockAtLeastFor 鎖最小持有時間
*/
@SchedulerLock(name = "testJob",lockAtLeastFor = 2000)
@Scheduled(cron = "1 1 1 * * *")
public void testJob(){
logger.info(Thread.currentThread().getName()+ ":"+new Date());
}
資料庫中表資料

提示:
可以一個專案2個埠啟動模擬多節點集群并發,具體操作百度,
ShedLock GitHub 相關檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/210891.html
標籤:其他
