Wenn Sie sich in einer JEE7-Umgebung befinden, muss eine anständige Implementierung von JAXRS vorhanden sein, mit der Sie mithilfe der Client-API problemlos asynchrone HTTP-Anforderungen stellen können.
Das würde so aussehen:
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));
}
}
Natürlich werden hier nur Futures verwendet. Wenn Sie mit der Verwendung weiterer Bibliotheken einverstanden sind, können Sie sich RxJava ansehen. Der Code sieht dann folgendermaßen aus:
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");
}
Und last but not least, wenn Sie Ihren asynchronen Anruf wiederverwenden möchten, sollten Sie sich Hystrix ansehen, mit dem Sie - zusätzlich zu einer Unmenge super cooler anderer Dinge - Folgendes schreiben können:
Zum Beispiel:
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);
}
}
Das Aufrufen dieses Befehls würde folgendermaßen aussehen:
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: Ich weiß, dass der Thread alt ist, aber es fühlte sich falsch an, dass niemand den Rx / Hystrix-Weg in den hochgestimmten Antworten erwähnt.