我想設定 Shedlock 來保護一個敏感的行程,這樣即使啟動了多個應用程式行程,也只有一個行程實體會運行。
在我的 pom.xml
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
</dependency>
我的資料庫:
CREATE TABLE shedlock(
name VARCHAR(64) NOT NULL,
lock_until TIMESTAMP NOT NULL,
locked_at TIMESTAMP NOT NULL,
locked_by VARCHAR(255) NOT NULL,
PRIMARY KEY (name));
我的配置:
@Configuration
@EnableScheduling
public class ShedlockConfiguration {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime()
.build()
);
}
}
我的日程表:
@Component
public class SchedulerA {
@Scheduled(initialDelayString = "${examples.scheduler.initial-delay:PT1S}",
fixedDelayString = "${examples.scheduler.fixed-delay:PT10S}")
@SchedulerLock(name = "example_scheduler",
lockAtLeastFor = "${examples.scheduler.lock-at-least:PT5S}",
lockAtMostFor = "${examples.scheduler.lock-at-most:PT30S}")
public void schedule() {
// Implementation not important
}
}
癥狀:如果我只使用多個 SchedulerA 類(如 SchedulerB、SchedulerC 等)啟動一個實體,這些類都是相同代碼的副本,我可以看到 Shedlock 執行其操作,并且一次只允許執行一個 LOCAL 實體。但是,當我啟動多個 Spring Boot 應用程式時,即使它們使用相同的資料庫、相同的表、相同的調度程式名稱,它們也會同時進行所有調度。我還注意到 DB 表中沒有任何條目,但除錯日志也沒有顯示任何錯誤。
問題:這是 Shedlock 的預期行為嗎?我應該研究另一種解決方案還是我配置錯誤?
uj5u.com熱心網友回復:
您需要根據檔案將 @EnableSchedulerLock 添加到您的配置類中:“為了啟用計劃鎖定,請使用 @EnableSchedulerLock 注釋”
uj5u.com熱心網友回復:
您需要在 Spring Boot 應用程式啟動的主類上添加帶有強制引數 defaultLockAtMostFor 的 @EnableSchedulerLock 注釋。它將防止同一 Spring Boot 應用程式的多個實體同時運行計劃任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314146.html
上一篇:用繼承和函式指標繞過受保護的程式
