यदि आप एक 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");
}
और अंतिम, लेकिन कम से कम, यदि आप अपने एसिक्स कॉल का पुन: उपयोग नहीं करना चाहते हैं, तो आप हिस्ट्रिक्स पर एक नज़र डालना चाह सकते हैं, जो - एक बिलियन सुपर कूल अन्य सामान के अलावा - आपको इस तरह से कुछ लिखने की अनुमति देगा:
उदाहरण के लिए:
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");
}
पुनश्च: मुझे पता है कि धागा पुराना है, लेकिन यह गलत लगा कि किसी ने भी वोटिंग के जवाब में आरएक्स / हिस्ट्रिक्स के तरीके का उल्लेख नहीं किया है।