gpt4 book ai didi

java - RxJava Single<> 带有计数、谓词和延迟

转载 作者:行者123 更新时间:2023-11-30 10:19:47 25 4
gpt4 key购买 nike

我正在做改造网络调用,它们都使用 Single<> 可返回。出现任何错误时,我都会根据谓词进行重试,最多 3 次。但我想引入延迟或指数退避。如何添加此延迟?

public <T> SingleTransformer<T, T> applySchIoAndRetry() {

return new SingleTransformer<T, T>() {
@Override
public SingleSource<T> apply(Single<T> upstream) {
return upstream
.subscribeOn(Schedulers.io())
.retry(3, new Predicate<Throwable>() {
@Override
public boolean test(Throwable throwable) throws Exception {

if (throwable instanceof HttpException) {
HttpException exception = (HttpException) throwable;
return (exception.code() != 400);
}

return false;
}
});
}
};
}

我在这里称它为:

public Single<Foo> bar() {
return apiService.foobar()
.compose(rxHelper.applySchIoAndRetry());
}

最佳答案

非常感谢@akarnokd用于指向 retryWhen Javadoc .基于此,这是我正在使用的解决方案:

public <T> SingleTransformer<T, T> applySchIoAndRetry() {

return new SingleTransformer<T, T>() {
@Override
public SingleSource<T> apply(Single<T> upstream) {
return upstream
.subscribeOn(Schedulers.io())
.retryWhen(errors -> {
AtomicInteger counter = new AtomicInteger();
return errors
.takeWhile(throwable -> {

if (counter.getAndIncrement() != 3) {

if (throwable instanceof HttpException) {
HttpException exception = (HttpException) throwable;
return (exception.code() == 400);
}
}

return false;
})
.flatMap(e -> {
System.out.println("delay retry by " + counter.get() + " second(s)");
return Flowable.timer(counter.get(), TimeUnit.SECONDS);
});
});
}
};
}

关于java - RxJava Single<> 带有计数、谓词和延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48458646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com