具有 CompletableFuture 的非阻塞异步 Jersey JAX-RS

Non-blocking asynchronous Jersey JAX-RS with CompletableFuture

我正在学习 Jersey,我在一本书中看到您可以使用 CompletableFuture(和 CompletitionStage)以非阻塞 IO 方式调用您的 API。

但是当我用 Postman 调用 API 时,我总是得到 500。

如果我调试代码,我会发现方法被正确调用。

第一个 GET 方法是同步的并且工作正常。 第二个和第三个return错误500.

我错过了什么?

@Path("/hello")
public class HelloController {

  @GET
  @Path("/first")
  @Produces(MediaType.TEXT_PLAIN)
  public String first() {
    return "It works";
  }

  @GET
  @Path("/second")
  @Produces(MediaType.TEXT_PLAIN)
  public CompletionStage<Response> second() {
    return CompletableFuture.supplyAsync(() -> Response.accepted().entity("Hello!").build());
  }

  @GET
  @Path("/third")
  @Produces(MediaType.TEXT_PLAIN)
  public CompletableFuture<Response> third() {
    return CompletableFuture.supplyAsync(() -> Response.accepted().entity("Hello!").build());
  }
}

这是使用 Jersey 创建异步端点的正确方法:

@POST
@Path("/goes")
@Consumes("application/json")
@Produces("application/json")
public void createTodoAsync3(@Suspended final AsyncResponse asyncResponse, Todo todo) {

    CompletableFuture<Response> future = CompletableFuture.supplyAsync(() -> createTodo3(todo));
    future.thenAccept(resp -> asyncResponse.resume(resp));
}
private Response createTodo3(Todo todo) {
    //all logic goes here
    return Response.accepted().entity(todo).build();
}