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

标签 java asynchronous jersey jax-rs completable-future

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

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

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

第一个 GET 方法是同步的并且可以正确工作。 第二个和第三个返回错误 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();
}

关于java - 具有 CompletableFuture 的非阻塞异步 Jersey JAX-RS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52606583/

相关文章:

java - 当我们可以使用ExecutorService时,为什么在EJB中使用@Asynchronous?

Java Swing 使用 defaulttablemodel 根据索引设置行和列的颜色

java - 调用需要权限,在尝试获取位置时可能会被用户拒绝

java - 抽象不同数据库的数据类型异构性

java - 获取 Jersey 反序列化为子类

rest - 空列表的 Jersey 响应为 null 而不是 {}

Java - JSON 输出并不像控制台所建议的那样

java - 框架打不开

php - Javascript/ajax/php 问题 : sending from server to client works, 从客户端发送到服务器失败

javascript - 错误 : Callback was already called when using pg-promise with async series