gpt4 book ai didi

java - 使用 Fallback Observable x 次

转载 作者:行者123 更新时间:2023-12-02 11:01:02 26 4
gpt4 key购买 nike

我有一个 Observable,它在 onErrorResumeNext 方法中实现错误处理。

getMyObservable(params)
.take(1)
.doOnError(e -> {
})
.onErrorResumeNext(throwable -> {
if (throwable.getMessage().contains("401")) {
return getMyObservable(params);
} else {
sendServerCommunicationError();
return Observable.error(throwable);
}
})
.subscribe(result -> {
... }
});

GetMyObservable() 从生成的客户端返回 Web 服务请求。用例是:如果我们收到 401,我们可能需要使用新的 UserToken 刷新客户端。这就是为什么我们在 onErrorResumeNext() 中使用 Fallback Observable 而不能只使用重试。

我有一些问题:

  1. 为什么我需要实现 doOnError?如果我不实现它,我有时会收到“onError not Implemented”异常。我认为当我使用 onErrorResumeNext 时,如果出现错误,会自动使用此方法。
  2. 如何在特定错误(如 401)上实现这一点,我使用具有一定退避时间的后备 Observable,并且在 5 次后产生错误。那么我可以以某种方式将 retryWhen 和 onErrorResumeNext 结合起来还是以不同的方式进行?

最佳答案

Why do I need to implement doOnError?

您不需要,并且 doOnError 不是错误处理程序,而是对错误 channel 的查看。您必须在 subscribe 中实现错误处理程序:

.subscribe(result -> {
// ...
},
error -> {
// ...
});

How can I achieve that on specific Errors (like 401) I use a fallback Observable with some backoff time and after 5 Times

使用retryWhen:

Observable.defer(() -> getMyObservable(params))
.retryWhen(errors -> {
AtomicInteger count = new AtomicInteger();
return errors.flatMap(error -> {
if (error.toString().contains("401")) {
int c = count.incrementAndGet();
if (c <= 5) {
return Observable.timer(c, TimeUnit.SECONDS);
}
return Observable.error(new Exception("Failed after 5 retries"));
}
return Observable.error(error);
})
})

关于java - 使用 Fallback Observable x 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51319665/

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