Si se encuentra en un entorno JEE7, debe tener una implementación decente de JAXRS rondando, lo que le permitiría realizar fácilmente solicitudes HTTP asíncronas utilizando su API de cliente.
Esto se vería así:
public class Main {
public static Future<Response> getAsyncHttp(final String url) {
return ClientBuilder.newClient().target(url).request().async().get();
}
public static void main(String ...args) throws InterruptedException, ExecutionException {
Future<Response> response = getAsyncHttp("http://www.nofrag.com");
while (!response.isDone()) {
System.out.println("Still waiting...");
Thread.sleep(10);
}
System.out.println(response.get().readEntity(String.class));
}
}
Por supuesto, esto es solo usar futuros. Si está de acuerdo con el uso de más bibliotecas, puede echar un vistazo a RxJava, el código se vería así:
public static void main(String... args) {
final String url = "http://www.nofrag.com";
rx.Observable.from(ClientBuilder.newClient().target(url).request().async().get(String.class), Schedulers
.newThread())
.subscribe(
next -> System.out.println(next),
error -> System.err.println(error),
() -> System.out.println("Stream ended.")
);
System.out.println("Async proof");
}
Y por último, pero no menos importante, si desea reutilizar su llamada asíncrona, es posible que desee echar un vistazo a Hystrix, que, además de un montón de otras cosas geniales, le permitiría escribir algo como esto:
Por ejemplo:
public class AsyncGetCommand extends HystrixCommand<String> {
private final String url;
public AsyncGetCommand(final String url) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HTTP"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionIsolationThreadTimeoutInMilliseconds(5000)));
this.url = url;
}
@Override
protected String run() throws Exception {
return ClientBuilder.newClient().target(url).request().get(String.class);
}
}
Llamar a este comando se vería así:
public static void main(String ...args) {
new AsyncGetCommand("http://www.nofrag.com").observe().subscribe(
next -> System.out.println(next),
error -> System.err.println(error),
() -> System.out.println("Stream ended.")
);
System.out.println("Async proof");
}
PD: Sé que el hilo es antiguo, pero me sentí mal que nadie mencionara el método Rx / Hystrix en las respuestas con votos positivos.