JEE7環境を使用している場合は、JAXRSの適切な実装が必要です。これにより、クライアントAPIを使用して非同期HTTPリクエストを簡単に作成できます。
これは次のようになります。
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を確認することをお勧めします。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の方法について誰も言及していないのは間違っていると感じました。