| 
                         然后配置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等的分布式锁实现机制。 
统一代码风格                         (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |