2017-09-11 21 views
0

我已可觀察到的,從很多渠道獲得項目:RxJava 2.重試與延遲,同時繼續是不同的其他項目

Source { List<Item> data } 

來源和項目之間的關係是多到許多和不同來源項目可能會重複自己。項目是應該上傳到服務器的實體,服務器不接受重複項目。爲了達到這個目的,我將資源合併到他們的ID中,然後將唯一的項目上傳到服務器。如下圖所示:

Observable.merge(source1(), source2(), source3()) 
      .flatMapIterable(sources -> sources) 
      .flatMapIterable(source::getItems) 
      .distinct(item -> item.getId()) 
      .flatMapCompletabale(item -> uploadItem(item)) 

項目上載能發出一些錯誤,並就其中一些我應該重試後再次上傳項目,並進行其他項目,而「失敗」一個正在等待它重試。

如何推遲重試上傳「失敗」的項目,並繼續其他項目,而這一個嘗試嘗試?

提前致謝!

回答

0

我把這個函數放到retryWhen方法中並讓它工作。

public class RetryWithDelay implements Function<Observable<? extends Throwable>, Observable<?>> { 

private final int maxRetryCount; 
private final int retryDelay; 
private int retryCount; 
private TimeUnit timeUnit; 

public RetryWithDelay(final int maxRetryCount, final int retryDelay, final TimeUnit timeUnit) { 
    this.maxRetryCount = maxRetryCount; 
    this.retryDelay = retryDelay; 
    this.timeUnit = timeUnit; 
    this.retryCount = 0; 
} 

@Override 
public Observable<?> apply(final Observable<? extends Throwable> attempts) { 
    return attempts.flatMap((Function<Throwable, Observable<?>>) throwable -> { 

     if (++retryCount < maxRetryCount) { 
      return Observable.timer(retryDelay, timeUnit); 
     } 

     return Observable.error(throwable); 
    }); 
} 
} 
1

要只處理一個上載的故障,可以在最後一步添加運算符:

.flatMapCompletable(item->uploadItem(item)) 

應該成爲

.flatMapCompletable(item->uploadItem(item) 
           .retryWhen(throwable -> 
            throwable.delay(5, TimeUnit.SECONDS))) 

編輯:我從this Dan Lew blog entry學到了很多關於retryWhen()運營商。您會發現幾個示例,包括使用zip()運算符與Observable.range(3)來限制重試次數。

+0

您好!謝謝您的回答!你能否也請說我如何添加重試次數?像5秒延遲重試3次。 –

+0

我參考的博客提供了示例代碼來做到這一點。 –

相關問題