然后配置Shedlock:
- @Configuration
- @EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
- public class DistributedLockConfiguration {
-
- @Bean
- public LockProvider lockProvider(DataSource dataSource) {
- return new JdbcTemplateLockProvider(dataSource);
- }
-
-
- @Bean
- public DistributedLockExecutor distributedLockExecutor(LockProvider lockProvider) {
- return new DistributedLockExecutor(lockProvider);
- }
-
-
- }
实现后台任务处理:
- @Scheduled(cron = "0 0/1 * * * ?")
- @SchedulerLock(name = "scheduledTask", lockAtMostFor = THIRTY_MIN, lockAtLeastFor = ONE_MIN)
- public void run() {
- logger.info("Run scheduled task.");
- }
为了支持代码直接调用分布式锁,基于Shedlock的LockProvider创建DistributedLockExecutor:
- public class DistributedLockExecutor {
- private final LockProvider lockProvider;
-
- public DistributedLockExecutor(LockProvider lockProvider) {
- this.lockProvider = lockProvider;
- }
-
- public <T> T executeWithLock(Supplier<T> supplier, LockConfiguration configuration) {
- Optional<SimpleLock> lock = lockProvider.lock(configuration);
- if (!lock.isPresent()) {
- throw new LockAlreadyOccupiedException(configuration.getName());
- }
-
- try {
- return supplier.get();
- } finally {
- lock.get().unlock();
- }
- }
-
- }
使用时在代码中直接调用:
- public String doBusiness() {
- return distributedLockExecutor.executeWithLock(() -> "Hello World.",
- new LockConfiguration("key", Instant.now().plusSeconds(60)));
- }
本文的示例项目使用了基于JDBC的分布式锁,事实上任何提供原子操作的机制都可用于分布式锁,Shedlock还提供基于Redis、ZooKeeper和Hazelcast等的分布式锁实现机制。
统一代码风格 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|