asynchronous - toCompletableFuture() 卡住异步缓存
问题描述
您好,我试图强制终止承诺以从中获得结果,但它只是卡在加载中。
public class CacheController extends Controller {
private AsyncCacheApi cache;
public Result cache()
{
String test = "nice";
cache.set("item.key", test, 15);
Customer user = new Customer("Ana", 12);
CompletionStage<Done> result = cache.set(user.getName(), user);
block(result);
return ok("Cached");
}
public Result checkCache() throws Exception
{
Logger.info("start");
//CompletionStage<String> news = cache.get("item.key");
//news.thenRun(() -> System.out.println("works"));
CompletionStage<Customer> result = cache.get("Ana");
Logger.info("step 1");
Logger.info(cache.get("Ana").toString());
Logger.info("Step 2");
Customer c = block(result);
Logger.info("Step 3 " + c.getName());
//result.thenRun(() -> setUser(result)).thenRun(() -> Logger.info(user.getName() + " " + user.getAge()));
return ok("cancan");
}
private <T> T block(CompletionStage<T> stage) {
try {
return stage.toCompletableFuture().get();
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}
尝试加载页面时,我猜测它在第 2 步之后卡住了line 56: Customer c = block(result);
有什么想法可以解决吗?
解决方案
@科德林
我有同样的问题。但是,请参阅https://www.playframework.com/documentation/2.6.x/JavaCache#Setting-the-execution-context
默认情况下,所有 Ehcache 操作都是阻塞的,异步实现会阻塞默认执行上下文中的线程。
也许 CompletableFuture.get() 卡住了,因为它与调用者在同一个线程中执行。
参考链接的页面,我在 application.conf 中添加了下面的代码段,它起作用了。
play.cache.dispatcher = "contexts.blockingCacheDispatcher"
contexts {
blockingCacheDispatcher {
fork-join-executor {
parallelism-factor = 3.0
}
}
}
推荐阅读
- java - Hyperjaxb 3 导入 XSD 和 persistence.xml
- json - @JsonPropert 抛出所有错过必填字段的异常
- jenkins - 如何在 Jenkins 日志中隐藏步骤调用
- scala - 为什么添加两个 List[Map[String, Any]] 将输出结果类型更改为 scala 中的 List[Equals]?
- r - ggplot中的Rscript无效字体类型
- java - 我如何在回收中首次启动应用程序时突出显示项目
- lua - 将变量分配给表
- php - Laravel 5.6 缓存存储了数千个值,都称为 :timer
- go - 如何为对象创建结构并在 golang 中获取值?
- haskell - printtype函数中的“代理a”是什么?