代码之家  ›  专栏  ›  技术社区  ›  Alessandro Argentieri

具有完全未来的非阻塞异步JAX-RS

  •  0
  • Alessandro Argentieri  · 技术社区  · 6 年前

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

    但是当我用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());
      }
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Alessandro Argentieri    6 年前

    @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();
    }