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étodo, 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 threadOutro 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 threadCallbacks
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.newCachedThreadPool).
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
Was this helpful?