Неблокирующая асинхронная Джерси JAX-RS с CompletableFuture - PullRequest
0 голосов
/ 02 октября 2018

Я изучаю Джерси, и я увидел в книге, что вы можете использовать CompletableFuture (и CompletitionStage) для вызова вашего API без блокировки ввода-вывода.

Но когда я вызываю API с помощью Postman, Я всегда получаю 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 Ответ

0 голосов
/ 27 ноября 2018

Это правильный способ создания асинхронной конечной точки с Джерси:

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