Clint Hwang
Clint Hwang

Reputation: 31

RxJava retry not working with Observer

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

Answers (2)

uramonk
uramonk

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

paul
paul

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

Related Questions