Reputation: 1554
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
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