这个和Vertx中的定时缓存类似,但是我要缓存的值是异步获取的。
在同步代码中我会这样做:
Supplier<String> supplier = Suppliers.memoizeWithExpiration(this::provideTokenInternal, 50, TimeUnit.MINUTES)
String provideTokenInternal() { .. }
String provideToken() {
return supplier.get()
}
我如何实现类似的结果,但使用异步编程:
WhatINeed<String> supplier = WhatINeed.memoizeWithExpiration(this::provideTokenInternal, 50, TimeUnit.MINUTES)
Future<String> provideTokenInternal() { .. }
Future<String> provideToken() {
return supplier.get()
}
也许我可以直接使用 Guava 供应商,但我不确定缓存 Future 对象是否有意义?
例如。人们报告问题重用 Future 对象。
Guava 实现也使用锁定,我希望 verte.x 本机解决方案无需锁定。我想我可以尝试
事实证明这是更简单的路线,主要是因为
https://github.com/eclipse-vertx/vertx-auth/blob/e57448c145676d6d152fcb07a1bbf7daded22142/vertx-auth-oauth2/src/main/java/中有一个现成的解决方案io/vertx/ext/auth/oauth2/impl/OAuth2AuthProviderImpl.java#L115-L129
public Future<Void> jWKSet() {
return api.jwkSet()
.compose(json -> {
// enforce a lock to ensure state isn't corrupted
synchronized (OAuth2AuthProviderImpl.this) {
if (updateTimerId != -1) {
// cancel any running timer to avoid multiple updates
// it is not important if the timer isn't active anymore
// this could happen if both the user triggers the update and
// there's a timer already in progress
vertx.cancelTimer(updateTimerId);
((VertxInternal) vertx).removeCloseHook(this);
}
了解如何以 vert.x 本机方式记忆任意 Future
结果(并且不使用缓存库)仍然会很高兴。由于 Guava 中 memoizer 的同步实现不到 50 行,我希望异步解决方案也很简单。