我是反应性编程的新手,我想把我的注意力集中在基本的概念上。基本上,我希望实现一个逻辑,如果它仍然有效,或者请求新的令牌,它将返回auth令牌。我的最佳选择是下面的代码:
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()“方法,那么它可能会在同一时间请求的几个新令牌中结束。如有任何指导和建议,我将不胜感激。
发布于 2022-11-08 09:11:10
这里有一个相对经典的线程安全问题。您可以考虑使用AtomicReference来保存token字段。
也就是说,Uni有一个memoize()操作符,它可以做您想做的事情。你应该能够做这样的事情:
return doGetToken().memoize().until(() -> someExpirationLogic());https://stackoverflow.com/questions/74354317
复制相似问题