Guava é um framework muito conhecido pelos desenvolvedores Java, que fornece vários objetos e utilitários para diversas necessidades. O java-restify
fornece suporte para uso de alguns objetos do Guava como retorno de método.
Instalação
O suporte para o Guava está na dependência java-restify-guava
. Uma vez presente no classpath
, os handlers
serão automaticamente registrados.
Maven
Copy <dependency>
<groupId>com.github.ljtfreitas</groupId>
<artifactId>java-restify-guava</artifactId>
<version>{version}</version>
</dependency>
Gradle
Copy dependencies {
compile("com.github.ljtfreitas:java-restify-guava:{version}")
}
Utilização
Tipos suportados
Copy import com.google.common.base.Optional;
public interface MyApi {
@Path("/customers/{id}") @Get
Optional<Customer> getCustomerById(@PathParameter String id);
}
ListenableFuture
(assíncrono)
ListenableFuture é um objeto que permite o registro de callbacks
para processamentos assíncronos. Métodos com esse tipo de retorno serão executados em uma thread
separada automaticamente.
Copy import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;
public interface MyApi {
@Path("/customers/{id}") @Get
ListenableFuture<Customer> getCustomerById(@PathParameter String id);
}
MyApi myApi = new RestifyProxyBuilder()
.target(MyApi.class)
.build();
ListenableFuture<Customer> future = myApi.getCustomerById("abc123");
FutureCallback<Customer> callback = new FutureCallback<FutureCallback>() {
void onSuccess(Customer result) {
};
void onFailure(Throwable t) {
};
};
Futures.addCallback(future, callback, MoreExecutors.directExecutor());
Outra opção é, ao invés de lidar com o retorno do método, utilizar um argumento do tipo FutureCallback , que deve estar anotado com @CallbackParameter
:
Copy import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;
public interface MyApi {
@Path("/customers/{id}") @Get
void getCustomerById(@PathParameter String id, @CallbackParameter FutureCallback<Customer> callback);
}
MyApi myApi = new RestifyProxyBuilder()
.target(MyApi.class)
.build();
myApi.getCustomerById("abc123", new FutureCallback<FutureCallback>() {
void onSuccess(Customer result) {
};
void onFailure(Throwable t) {
};
};
ListenableFutureTask
(assíncrono)
ListenableFutureTask é equivalente ao ListenableFuture
, mas com uma API baseada no FutureTask
do Java.
Copy import com.google.common.util.concurrent.ListenableFutureTask;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;
public interface MyApi {
@Path("/customers/{id}") @Get
ListenableFutureTask<Customer> getCustomerById(@PathParameter String id);
}
Configuração
No caso dos tipos assíncronos, a configuração padrão utiliza um cached thread pool isolado dos demais handlers
assíncronos do java-restify
. Caso você precise de customizações, desligue a descoberta automática de handlers
e registre-os manualmente:
Copy import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.github.ljtfreitas.restify.http.client.call.handler.guava.ListenableFutureEndpointCallHandlerAdapter;
import com.github.ljtfreitas.restify.http.client.call.handler.guava.ListenableFutureCallbackEndpointCallHandlerAdapter;
import com.github.ljtfreitas.restify.http.client.call.handler.guava.ListenableFutureTaskEndpointCallHandlerAdapter;
Executor myExecutor = Executors.newFixedThreadPool(10);
ListeningExecutorService myExecutorService = MoreExecutors.listeningDecorator(myExecutor);
MyApi myApi = new RestifyProxyBuilder()
.handlers()
.discovery()
.disabled()
.add(new ListenableFutureEndpointCallHandlerAdapter<>(myExecutorService))
.add(new ListenableFutureCallbackEndpointCallHandlerAdapter<>(myExecutorService))
.add(new ListenableFutureTaskEndpointCallHandlerAdapter<>(myExecutorService))
.and()
.target(MyApi.class)
.build();