Suppliers.memoizeWithExpiration()的异步版本

问题描述 投票:0回答:1

这个和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 本机解决方案无需锁定。

我想我可以尝试

咖啡因,但如果我想缓存的只是一个访问令牌,这似乎有点矫枉过正。

caching vert.x
1个回答
0
投票
最后我接受了评论建议,使用定期更新任务。

事实证明这是更简单的路线,主要是因为

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 行,我希望异步解决方案也很简单。

© www.soinside.com 2019 - 2024. All rights reserved.