由于您有一个现有的令牌管理器,我将向其中添加一些额外的逻辑(Java):
class TokenManager {
private String accessToken;
private CompletableFuture<String> accessTokenRefreshComletableFuture;
public CompletableFuture<String> getAccessToken() {
if (this.accessToken is expired) {
// If refreshed accessToken is being requested
CompletableFuture<String> runningRequestFuture = this.accessTokenRefreshComletableFuture;
if (runningRequestFuture == null) {
// For thread safety, this assignment should be synchronized (or made atomic)
// with the previous reading
this.accessTokenRefreshComletableFuture = new CompletableFuture<>();
// Request a fresh access token.
// When you get a new access token, set the this.accessTokenRefreshComletableFuture
// complete and remove its reference from the manager class.
}
return runningRequestFuture;
}
// Synchronous result
return CompletableFuture.completedFuture(this.accessToken);
}
}
管理器不返回访问令牌,而是返回
CompletableFuture
(JavaScript中的承诺-异步结果)。如果需要刷新访问令牌,请首先检查
/token
终结点请求已在运行。如果是的话,把它的
CompletableFuture
这样,您将始终拥有有效的访问令牌或单个
完全未来