我正在尝试使用RxJava2库创建服务器调用,该库将尝试轮询服务器以获取答案,并且如果连续3次收到异常以返回该异常
我已经建立了一个基本调用,可以从服务器获取响应
final Observable<ResponseValue> responseValueObservable = Observable
.fromCallable((Callable) (c) -> return getDispatcher().performSubmit(submitValue);
}
});
return responseValueObservable
.retry(3)
.subscribeOn(Schedulers.io()
.onError((t) -> { log.error(t); Observable.timer(2, SECONDS);}
.retryUntil(() -> { return retryIsEnabled }
因此getDispatcher().performSubmit(submitValue)
返回SubmitException
或ResponseValue
对象。
我需要代码重试3次,每次异常后暂停2秒钟,然后返回ResponseValue
或最后一个SubmitException
答案 0 :(得分:0)
使用retryWhen()
运算符来自定义对错误的响应。来自Dan Lew's Blog的出色概述:
responseValueObservable
.retryWhen( errorObservable -> errorObservable
.zipWith(Observable.range(1, 3), (n, i) -> i)
.flatMap(retryCount -> Observable.timer(2, TimeUnit.SECONDS)))
...
答案 1 :(得分:0)
因此,从上一个答案中读完Dan Lew's Blog后,我便可以将这段代码组合在一起,正是我想要的。等待2秒后,retryWhen()
会自动重新订阅。从服务器第一次成功答复后,它停止了。
Observable.fromCallable((d::performSubmit))
.subscribeOn(Schedulers.io())
.doOnSubscribe(subscription -> System.out.println("Subscribing"))
.retryWhen(errors -> {
AtomicInteger counter = new AtomicInteger();
return errors
.takeWhile(e -> counter.incrementAndGet() < 3)
.flatMap(e -> {
System.out.println("delay retry by 2 second(s)");
return Observable.timer(2, TimeUnit.SECONDS);
});
}).blockingSubscribe(res -> result = Optional.of(res), throwable -> t = Optional.of((Exception) throwable));