Если вы находитесь в среде 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, которая - в дополнение к невероятному числу других вещей - позволит вам написать что-то вроде этого: 1009 *
Например:
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 в ответах с повышенным голосованием.