Zahid Rasheed
Zahid Rasheed

Reputation: 1554

Retry on a completable observable

I've 2 observables. 1) Sync orders (Completable) 2) Get All orders. I want to Keep syncing products until I get the desired product from the backend. This is polling the backend 5 times every 5 minutes to retrieve order confirmation.

 apiService
.syncOrders()
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
        @Override
        public Observable<Integer> call(final Observable<? extends Void> observable) {
            // Retry 5 more times with 5 seconds delay
            return observable.delay(5, TimeUnit.SECONDS).zipWith(Observable.range(START_RETRY,
                                                                                  MAX_RETRIES),
                                                                 new Func2<Void, Integer, Integer>() {
                                                                     @DebugLog
                                                                     @Override
                                                                     public Integer call(Void v,
                                                                                         Integer integer) {
                                                                         return integer;
                                                                     }
                                                                 });
        }
    }).andThen(apiService.streamOrders().flatMap(new Func1<List<Order>, Observable<Order>>() {
        @Override
        public Observable<Order> call(List<Order> orderList) {
            return Observable.from(orderList);
        }
    }).filter(new Func1<Order, Boolean>() {
        @DebugLog
        @Override
        public Boolean call(Order order) {
            return order.orderRef() == orderId;
        }
    }).first());

Upvotes: 0

Views: 1145

Answers (1)

akarnokd
akarnokd

Reputation: 69997

Repeating a Completable that completes normally won't trigger andThen ever. You have to redesign your flow, for example running an Observable.interval with 5 minutes period, flatMap its value into the first completable and attach andThen into that inner flow, for example:

Observable.interval(0, 5, TimeUnit.MINUTES)
.onBackpressureLatest()
.flatMap(tick -> 
     apiService.syncOrders()
     .andThen(apiService.streamOrders().flatMapIterable(list -> list))
     .retryWhen(error -> error.delay(5, TimeUnit.SECONDS))
)
.filter(v -> ...)
.subscribe(...);

Upvotes: 1

Related Questions