Jeśli jesteś w środowisku JEE7, musisz mieć przyzwoitą implementację JAXRS, która umożliwiłaby łatwe tworzenie asynchronicznych żądań HTTP za pomocą jego klienta API.
Wyglądałoby to tak:
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));
}
}
Oczywiście jest to po prostu wykorzystanie futures. Jeśli nie masz nic przeciwko używaniu większej liczby bibliotek, możesz rzucić okiem na RxJava, kod wyglądałby wtedy następująco:
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");
}
I wreszcie, jeśli chcesz ponownie użyć wywołania asynchronicznego, możesz rzucić okiem na Hystrix, który - oprócz miliardów super fajnych innych rzeczy - pozwoliłby ci napisać coś takiego:
Na przykład:
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);
}
}
Wywołanie tego polecenia wyglądałoby tak:
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");
}
PS: Wiem, że wątek jest stary, ale czułem się źle, że nikt nie wspomina o sposobie Rx / Hystrix w odpowiedziach głosowanych w górę.