Visão geral

O java-restify oferece suporte para requisições assíncronas de maneira bastante simples.

Um detalhe de implementação importante é que o java-restify diferencia a execução assíncrona do método da execução assíncrona da requisição.

Tipos de retorno assíncronos

Conforme comentado na documentação sobre tipos de retorno de métodoarrow-up-right, alguns tipos, como Future, CompletableFuture, irão automaticamente forçar que o método seja executado em uma thread diferente.

public interface MyApi {

    @Path("/customers/{id}") @Get
    CompletableFuture<Customer> getCustomerById(@PathParameter String id);
}

MyApi myApi = new RestifyProxyBuilder()
    .target(MyApi.class)
        .build();

myApi.getCustomerById("abc123")
    .thenAccept(customer -> ...) //outra thread

Outro tipo que pode ser utilizado como retorno do método é o AsyncEndpointCall, um objeto fornecido pelo java-restify que representa a execução assíncrona de uma requisição.

public interface MyApi {

    @Path("/customers/{id}") @Get
    AsyncEndpointCall<Customer> getCustomerById(@PathParameter String id);
}

MyApi myApi = new RestifyProxyBuilder()
    .target(MyApi.class)
        .build();

AsyncEndpointCall<Customer> call = myApi.getCustomerById("abc123"); // lazy - a requisição ainda não foi realizada

call.executeAsync()
    .thenAccept(customer -> ...) //outra thread

Callbacks

Outra abordagem é, ao invés de lidar com o retorno do método, é utilizar argumentos de callback, usando a anotação @CallbackParameter:

Ao utilizar parâmetros anotados com @CallbackParameter, o retorno do método deve ser void.

Configuração

Os handlers responsáveis pela execução de métodos assíncronos utilizam o mesmo thread pool configurado para requisições assíncronas. Por padrão, é utilizad um Executor criado a partir do método Executors.newCachedThreadPoolarrow-up-right).

Se a configuração padrão não atender as necessidades da sua aplicação, o Executor pode ser facilmente customizado:

Clientes HTTP assíncronos

Os exemplos acima demonstram o suporte do java-restify para execução assíncrona de métodos, usando o tipo de retorno ou argumentos de callback. Nesse cenário, o java-restify irá apenas executar em outra thread os mesmos passos de qualquer chamada de método. O ponto a ser observado aqui é que a requisição HTTP continua a ser uma operação bloqueante, mas sendo realizada em uma thread separada.

Isso é útil, mas eventualmente pode ser importante utilizarmos os recursos assíncronos do próprio client HTTP, como por exemplo I/O não-bloqueante ou algum suporte especializado fornecido pela própria biblioteca. O java-restify também oferece uma API específica para clientes HTTP assíncronos. Os detalhes são explicados mais profundamente na documentação sobre clientes HTTP.

Se o java-restify estiver configurado para utilizar um cliente HTTP assíncrono, então os recursos específicos da implementação serão utilizados; se não for o caso (como é o padrão), a execução do método (incluindo a requisição HTTP) apenas será feita em uma thread separada (conforme detalhado acima).

Last updated