首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Mutiny缓存令牌

用Mutiny缓存令牌
EN

Stack Overflow用户
提问于 2022-11-07 23:59:47
回答 1查看 26关注 0票数 0

我是反应性编程的新手,我想把我的注意力集中在基本的概念上。基本上,我希望实现一个逻辑,如果它仍然有效,或者请求新的令牌,它将返回auth令牌。我的最佳选择是下面的代码:

代码语言:javascript
复制
public class AsyncTokenSupplier implements Supplier<Uni<Token>> {
   private Token cachedToken;

   @Override
   public Uni<Token> get() {
        if (isTokenValid(cachedToken)) {
            return Uni.createFrom().item(cachedToken);
        } else {
            return doGetToken().onItem().invoke(token -> {
                cachedToken = token;
            });
        }
    }

   private Uni<Token> doGetToken() {
      //Api call here
   }

   private boolean isTokenValid(Token token) {
      if (token == null) {
         return false;
      }
      //Expiration check here
   }
}

这段代码的问题在于它看上去不像线程安全--如果有几个线程并行执行"get()“方法,那么它可能会在同一时间请求的几个新令牌中结束。如有任何指导和建议,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2022-11-08 09:11:10

这里有一个相对经典的线程安全问题。您可以考虑使用AtomicReference来保存token字段。

也就是说,Uni有一个memoize()操作符,它可以做您想做的事情。你应该能够做这样的事情:

代码语言:javascript
复制
return doGetToken().memoize().until(() -> someExpirationLogic());
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74354317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档