Reputation: 31
It is a very simple sample:
public static void main(String[] args) {
Observable.from(ListUtils.asList(1, 2, 3)).retry(3).subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onNext(Integer integer) {
System.out.println(integer);
if (integer == 3)
throw new RuntimeException("onNext exception");
}
});
}
The console output is: 1,2,3,onError. But my Expected: 1,2,3,1,2,3,1,2,3,onError.
Upvotes: 3
Views: 2125
Reputation: 1232
retry()
operator resubscribe and execute above process when observable emits an error.
Please refer this.
And I write sample code.
Observable.from(Arrays.asList(1, 2, 3, 4))
.flatMap(new Func1<Integer, Observable<Integer>>() {
@Override public Observable<Integer> call(Integer integer) {
if(integer == 4) {
return Observable.error(new Exception());
}
return Observable.just(integer);
}
})
// When error occurred, re-subscribe and execute above process
// If error occurred over 2 times, Observer.onError occurred
.retry(2)
.subscribe(new Observer<Integer>() {
@Override public void onCompleted() {
System.out.println("onCompleted");
}
@Override public void onError(Throwable e) {
System.out.println("onError");
}
@Override public void onNext(Integer integer) {
System.out.println(integer);
}
});
Upvotes: -1
Reputation: 13481
Once than an error happens the subscriber unsubscriber from the observable, and in case you use operator retry it will retry only if the operator is not used in the main pipeline but in a flatMap operator
This one since the retry is after a flatMap it will work
@Test
public void retryInFlatMap() {
Observable.from(Arrays.asList(1, 2, 3, 4))
.flatMap(number -> Observable.just(number)
.doOnNext(n -> {
if (n == 2) {
throw new NullPointerException();
}
}))
.retry(3)
.subscribe(n-> System.out.println("number:"+n));
}
This one, since is after a map it wont
int cont=0;
@Test
public void retryInMap() {
Observable.from(Arrays.asList(1, 2, 3, 4))
.map(number ->{
if (cont == 2) {
throw new NullPointerException();
}
cont++;
return number;
})
.retry(3)
.subscribe(n-> System.out.println("number:"+n));
}
If you want to see more examples take a look here https://github.com/politrons/reactive
Upvotes: 4