2017-03-04 11 views
-1

2つの観測値があります。 1)注文を同期する(完了可能)2)すべての注文を取得する。 バックエンドから希望の製品を入手するまで、製品の同期を維持したいと考えています。これは5分ごとに5回ポーリングして注文確認を取得します。完了可能な観測で再試行

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()); 
+0

方法([retryWhen]についてのhttp ://reactivex.io/RxJava/javadoc/rx/Completable.html#retryWhen(rx.functions.Func1))? – tynn

答えて

1

正常に完了しCompletableを繰り返すこと、これまでandThenをトリガしません。あなたは、あなたの流れを再設計する必要が5分周期でObservable.intervalを実行しているたとえば、最初のcompletableにその値をflatMapし、例えば、その内側の流れにandThenを添付:

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(...); 
+0

私は試してみましたが、これは代わりにapiService.streamOrders()に再試行しました。ストリームからオーダーが見つからないと直ちに同期を再試行したいと思います。 –

関連する問題