Якщо ви перебуваєте в середовищі JEE7, ви повинні мати гідну реалізацію JAXRS, яка зависає, що дозволить вам легко робити асинхронний HTTP-запит, використовуючи його клієнтський API.
Це виглядає так:
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));
}
}
Звичайно, це просто використання ф’ючерсів. Якщо ви в порядку з використанням деяких інших бібліотек, ви можете поглянути на RxJava, тоді код виглядатиме так:
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");
}
І останнє, але не менш важливе: якщо ви хочете повторно використати свій асинхронний виклик, ви можете захотіти поглянути на Hystrix, який - крім безлічі супер крутих речей - дозволить вам написати щось подібне:
Наприклад:
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);
}
}
Виклик цієї команди буде виглядати так:
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: Я знаю, що нитка застаріла, але мені здалося неправильним, що ніхто не згадує Rx / Hystrix у відповідях, за якими проголосували.