Nếu bạn đang ở trong môi trường JEE7, bạn phải có một triển khai JAXRS ổn định, điều này sẽ cho phép bạn dễ dàng thực hiện yêu cầu HTTP không đồng bộ bằng cách sử dụng API ứng dụng khách của nó.
Điều này sẽ trông như thế này:
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));
}
}
Tất nhiên, đây chỉ là sử dụng tương lai. Nếu bạn đồng ý với việc sử dụng thêm một số thư viện, bạn có thể xem qua RxJava, mã sau đó sẽ giống như sau:
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");
}
Và cuối cùng nhưng không kém phần quan trọng, nếu bạn muốn sử dụng lại lệnh gọi không đồng bộ của mình, bạn có thể muốn xem qua Hystrix, điều này - ngoài một thứ cực kỳ thú vị khác - sẽ cho phép bạn viết một cái gì đó như sau:
Ví dụ:
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);
}
}
Gọi lệnh này sẽ giống như sau:
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");
}
Tái bút: Tôi biết chủ đề này đã cũ, nhưng cảm thấy sai khi không có ai đề cập đến cách Rx / Hystrix trong các câu trả lời được bình chọn cao.