设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

后端开发实践系列——Spring Boot项目模板(5)

发布时间:2019-07-24 12:53 所属栏目:21 来源:无知者云
导读:然后配置Shedlock: @Configuration @EnableSchedulerLock(defaultLockAtMostFor=PT30S) publicclassDistributedLockConfiguration{ @Bean publicLockProviderlockProvider(DataSourcedataSource){ returnnewJdbcTe

然后配置Shedlock:

  1. @Configuration 
  2. @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") 
  3. public class DistributedLockConfiguration { 
  4.  
  5.     @Bean 
  6.     public LockProvider lockProvider(DataSource dataSource) { 
  7.         return new JdbcTemplateLockProvider(dataSource); 
  8.     } 
  9.  
  10.  
  11.     @Bean 
  12.     public DistributedLockExecutor distributedLockExecutor(LockProvider lockProvider) { 
  13.         return new DistributedLockExecutor(lockProvider); 
  14.     } 
  15.  
  16.  

实现后台任务处理:

  1. @Scheduled(cron = "0 0/1 * * * ?") 
  2.     @SchedulerLock(name = "scheduledTask", lockAtMostFor = THIRTY_MIN, lockAtLeastFor = ONE_MIN) 
  3.     public void run() { 
  4.         logger.info("Run scheduled task."); 
  5.     } 

为了支持代码直接调用分布式锁,基于Shedlock的LockProvider创建DistributedLockExecutor:

  1. public class DistributedLockExecutor { 
  2.     private final LockProvider lockProvider; 
  3.  
  4.     public DistributedLockExecutor(LockProvider lockProvider) { 
  5.         this.lockProvider = lockProvider; 
  6.     } 
  7.  
  8.     public <T> T executeWithLock(Supplier<T> supplier, LockConfiguration configuration) { 
  9.         Optional<SimpleLock> lock = lockProvider.lock(configuration); 
  10.         if (!lock.isPresent()) { 
  11.             throw new LockAlreadyOccupiedException(configuration.getName()); 
  12.         } 
  13.  
  14.         try { 
  15.             return supplier.get(); 
  16.         } finally { 
  17.             lock.get().unlock(); 
  18.         } 
  19.     } 
  20.  

使用时在代码中直接调用:

  1. public String doBusiness() { 
  2.         return distributedLockExecutor.executeWithLock(() -> "Hello World.", 
  3.                 new LockConfiguration("key", Instant.now().plusSeconds(60))); 
  4.     } 

本文的示例项目使用了基于JDBC的分布式锁,事实上任何提供原子操作的机制都可用于分布式锁,Shedlock还提供基于Redis、ZooKeeper和Hazelcast等的分布式锁实现机制。

统一代码风格

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读