package learnrxjava.examples; import java.util.concurrent.atomic.AtomicInteger; import rx.Observable; import rx.Subscriber; public class ConditionalRetry { public static void main(String[] args) { final AtomicInteger c = new AtomicInteger(); Observable<String> oWithRuntimeException = Observable.create((Subscriber<? super String> s) -> { System.out.println("Execution: " + c.get()); if (c.incrementAndGet() < 3) { s.onError(new RuntimeException("retryable")); } else { s.onNext("hello"); s.onCompleted(); } }); final AtomicInteger c2 = new AtomicInteger(); Observable<String> oWithIllegalStateException = Observable.create((Subscriber<? super String> s) -> { System.out.println("Execution: " + c2.get()); if (c2.incrementAndGet() < 3) { s.onError(new RuntimeException("retryable")); } else { s.onError(new IllegalStateException()); } }); subscribe(oWithRuntimeException); subscribe(oWithIllegalStateException); } public static void subscribe(Observable<String> o) { o = o.materialize().flatMap(n -> { if (n.isOnError()) { if (n.getThrowable() instanceof IllegalStateException) { return Observable.just(n); } else { return Observable.error(n.getThrowable()); } } else { return Observable.just(n); } }).retry().dematerialize(); o.subscribe(System.out::println, t -> t.printStackTrace()); } }