-
-
Save ZacSweers/7902e3a0286774630f4f to your computer and use it in GitHub Desktop.
// retries up to 3 times while exponentially backing off with each retry | |
.retryWhen(errors -> | |
errors | |
.zipWith( | |
Observable.range(1, MAX_RETRIES), (n, i) -> i | |
) | |
.flatMap( | |
retryCount -> Observable.timer((long) Math.pow(4, retryCount), TimeUnit.SECONDS) | |
) | |
) |
@trajakovic that is correct, you just need to use doOnError because the error is handled silently because of retry.
Something like this: doOnError(throwable ->Timber.e(throwable, "Blablabla Error has been occurred"))
For me it is more interesting, that the timer is not happening anymore, but the statement in retryWhen gets called obviously.
@trajakovic you can try this
// retries up to 3 times while exponentially backing off with each retry
.retryWhen(errors ->
errors
.scan((errCount, err) -> {
if (errCount > MAX_RETRIES)
throw err;
return errCount + 1;
}, 0)
.flatMap(
retryCount -> Observable.timer((long) Math.pow(4, retryCount), TimeUnit.SECONDS)
)
)
You guys should try something like this, the example retry 3 times(With a delay of one second) after this return the error:
static final int retrycount=4;
///...
.retryWhen(errors->errors
.zipWith(Observable.range(1,retrycount),(err,attempt)->
attempt<retrycount?
Observable.timer(1,TimeUnit.SECONDS):
Observable.error(err))
.flatMap(x->x)
)
//Tested and running at 100%
@FAMM2017, thank you. And I also found the same answer here: https://stackoverflow.com/questions/37860856/catch-error-if-retrywhens-retries-runs-out.
Since this was high result on google for Rx retryWhen exponential backoff, this implementation is slightly wrong.
By wrong I mean that this logic will never return error, even if MAX_RETRIES are exhausted.
So, if you put this on test:
Observable.throw(new Exception("Exception")).retryWhen(.....).subscribe()
will finish without error.