SchedulerLock分布式定时任务锁
warning:
这篇文章距离上次修改已过189天,其中的内容可能已经有所变动。
SchedulerLock是一个用于分布式环境中防止任务重复执行的工具,通常用于定时任务调度框架如Quartz或者Spring Batch中。
以下是使用SchedulerLock实现分布式定时任务的一个简单示例:
import net.javacrumbs.shedlock.core.LockConfiguration;
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.core.SimpleLock;
import java.time.Instant;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Supplier;
public class DistributedSchedulerLock implements LockProvider {
private final Storage storage; // 假设有一个存储锁信息的存储
@Override
public Optional<SimpleLock> lock(LockConfiguration lockConfiguration) {
String lockValue = UUID.randomUUID().toString();
boolean lockAcquired = storage.insertUniqueRecord(lockConfiguration.getName(), lockValue, lockConfiguration.getLockAtMostUntil());
if (lockAcquired) {
return Optional.of(new SimpleLock() {
@Override
public void unlock() {
storage.deleteRecord(lockConfiguration.getName(), lockValue);
}
});
}
return Optional.empty();
}
public <T> T executeWithLock(LockConfiguration lockConfiguration, Supplier<T> task, T defaultResult) {
Optional<SimpleLock> lock = lock(lockConfiguration);
try {
if (lock.isPresent()) {
return task.get();
}
return defaultResult;
} finally {
lock.ifPresent(SimpleLock::unlock);
}
}
}
// 使用示例
public class Scheduler {
private final DistributedSchedulerLock lockProvider;
public Scheduler(DistributedSchedulerLock lockProvider) {
this.lockProvider = lockProvider;
}
public void runTask() {
LockConfiguration lockConfig = LockConfiguration.builder()
.lockAtLeastFor(1, TimeUnit.HOURS)
.lockAtMostFor(2, TimeUnit.HOURS)
.withName("myTaskName")
.build();
lockProvider.executeWithLock(lockConfig, () -> {
// 定时任务的逻辑
System.out.println("Task is running...");
return true;
}, false);
}
}
在这个示例中,DistributedSchedulerLock
类实现了LockProvider
接口,并提供了一个\`executeWithLo
评论已关闭