2017-09-11 22 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

我参考的博客提供了示例代码来做到这一点。 –

相关问题