Shedlock
を使用して、scheduler
タスクを複数実行する場合は、サービスを複数実行する場合に1回のみ実行します。ShedLock:複数のインスタンスを実行するとスケジューラタスクが複数回実行される
私はdocumentationに従っており、これは私が行ったものです。
これは定期的に私のconfigクラスで
@Scheduled(fixedDelayString = "300000")
@SchedulerLock(name = "onlineIngestionTask", lockAtMostFor = 240000, lockAtLeastFor = 240000)
public void pullTasksFromRemote() {
//Code
}
を実行するために必要な機能である私は、以下の豆を持って
@Bean
public ScheduledLockConfiguration taskScheduler(LockProvider lockProvider) {
return ScheduledLockConfigurationBuilder
.withLockProvider(lockProvider)
.withPoolSize(10)
.withDefaultLockAtMostFor(Duration.ofMinutes(10))
.build();
}
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}
ポンポンが
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>0.14.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>0.14.0</version>
</dependency>
が含まれて私は、テーブルを追加しました私のdbには、jdbcが接続するものがあります。この後
CREATE TABLE shedlock(
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
)
私はその後、私はポート9000で再びそれを実行するためにserver.port=9000
を使用しますが、これらの両方のインスタンスがタスクの実行を開始ポート8080に最初の股関節PPを実行することで機能をテストしてみました。私は何かが欠けている。実装に何か間違っていますか?誰かが何か考えを与えることはできますか?ありがとう!!
私はShedlockを知らないので、ばかげた質問かもしれませんが、あなたのインスタンスに異なるlocked_by値があるかどうかチェックしましたか? –
@JeremyGrandインスタンスはまったく同じです。それらは異なるポートでのみ実行されます。 :/ – varunkr
あなたは彼らが両方とも彼ら自身のためにロックを持っていると思うかもしれないと思いませんか? –