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....");
});
添加回答
舉報