2017-09-11 4 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() 연산자를 배웠다 . 재 시도 횟수를 제한하기 위해 Observable.range(3)과 함께 zip() 연산자를 사용하는 것을 포함하여 몇 가지 예가 있습니다.

+0

안녕하세요! 답변 주셔서 감사합니다! 재시도 횟수를 더하는 방법을 알려주시겠습니까? 5 초 지연으로 3 번 재 시도하십시오. –

+0

내가 언급 한 블로그는이를 수행하기위한 샘플 코드를 제공합니다. –

관련 문제