package rfx.server.util.http; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Observer; import rx.Subscriber; public class HttpClientAsynchCaller { ExecutorService executor; public HttpClientAsynchCaller() { super(); this.executor = new ThreadPoolExecutor(4, 4, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>()); } protected static class CallWebServiceTask implements Callable<Void> { Subscriber<? super String> subscriber; String url; public CallWebServiceTask(Subscriber<? super String> subscriber, String url) { super(); this.subscriber = subscriber; this.url = url; } @Override public Void call() throws Exception { subscriber.onNext(synchronizedCall(url)); return null; } }; public static String synchronizedCall(String url) { return HttpClientUtil.executeGet(url); } public Observable<String> call(final String url) { return Observable.create(new OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { if (subscriber.isUnsubscribed()) { return; } try { executor.submit(new CallWebServiceTask(subscriber, url)).get(); } catch (Exception e) { subscriber.onError(e); } subscriber.onCompleted(); executor.shutdownNow(); return; } }); } public Observable<String> call(final String... urls) { return Observable.create(new OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { for (String url : urls) { if (subscriber.isUnsubscribed()) { return; } try { executor.submit(new CallWebServiceTask(subscriber, url)) .get(); } catch (Exception e) { subscriber.onError(e); } } subscriber.onCompleted(); executor.shutdownNow(); return; } }); } public static void main(String[] args) { String url1 = "http://www.javacodegeeks.com/2013/07/java-futuretask-example-program.html"; String url2 = "http://techblog.netflix.com/2013/02/rxjava-netflix-api.html"; String url3 = "https://github.com/Netflix/RxJava/wiki/Creating-Observables"; new HttpClientAsynchCaller().call(url1, url2, url3).subscribe( new Observer<String>() { @Override public void onCompleted() { System.out.println("Done!"); } @Override public void onError(Throwable arg0) { // TODO Auto-generated method stub } @Override public void onNext(String html) { System.out.println(html); } }); } }