JEE7 환경에있는 경우 클라이언트 API를 사용하여 쉽게 비동기 HTTP 요청을 만들 수있는 적절한 JAXRS 구현이 있어야합니다.
이것은 다음과 같습니다.
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");
}
추신 : 스레드가 오래되었다는 것을 알고 있지만 아무도 찬성 응답에서 Rx / Hystrix 방식을 언급하지 않는다는 것이 잘못되었다고 느꼈습니다.