2 回答
TA贡献2003条经验 获得超2个赞
您的实现的问题在于它违反了黄金法则 - 不要阻止事件循环。您不应该像CompletableFuture.get()在事件循环中那样调用阻塞操作。同样,sampleHandler()也不应该调用Thread.sleep()事件循环,但这是一个较小的问题。
结果是你的事件循环现在被阻塞了……所以你的/sample请求不能再被处理了。并且由于请求没有被处理,你CompletableFuture仍然没有完成……死锁。
这个问题有两种可能的解决方案:
CompletableFuture按设计使用,依赖于链式调用而不是get(),尽管它不强制执行 Vert.x 的线程模型。例如:
comp.whenComplete((result, e) -> {
System.out.println("Got sample response");
if (e != null) {
context.response().setStatusCode(500)
.end(e.getMessage());
} else {
context.response().setStatusCode(200)
.putHeader("content-type", "text/html")
.end(result);
}
System.out.println("end testCompBlocking....");
});
使用 Vert.x 工具运行阻塞代码。这应该不是必需的,CompletableFuture但其他 API 可能需要它。例如:
context.vertx().<String>executeBlocking(future -> {
String result = "Not Success";
try {
result = comp.get();
} catch (Exception e) {
System.out.println("Exception in getting from Completable..." + e.getMessage());
e.printStackTrace();
}
future.complete(result);
},
false,
result -> {
context.response().setStatusCode(200);
context.response().putHeader("content-type", "text/html");
context.response().end(result.result());
System.out.println("end testCompBlocking....");
});
添加回答
举报