RxJava 是一个在 Java 虚拟机(JVM)上使用可观测序列来组成异步和基于事件的程序的库。它扩展了观察者模式以支持数据/事件序列,并添加了操作符,使得可以声明性地组合序列,同时抽象出对低级线程、同步、线程安全和并发数据结构等问题的关注。
在 RxJava 中,如果你想要并行调用两个 API 并且每个调用使用不同的参数,并且在失败时重试,你可以使用 flatMap
操作符结合 retryWhen
操作符来实现。
以下是一个简单的示例代码,展示了如何实现这一功能:
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.functions.Function;
import java.util.concurrent.TimeUnit;
public class RxJavaRetryExample {
public static void main(String[] args) {
// 模拟两个API调用
Observable<String> apiCall1 = callApiWithParams("param1");
Observable<String> apiCall2 = callApiWithParams("param2");
// 并行调用两个API
Observable.merge(apiCall1, apiCall2)
.retryWhen(errors -> errors
.zipWith(Observable.range(1, 3), (error, attempt) -> {
if (attempt == 3) {
throw new RuntimeException("Failed after 3 attempts", error);
}
return attempt;
})
.flatMap(attempt -> Observable.timer(attempt * 2, TimeUnit.SECONDS)))
.subscribe(
response -> System.out.println("Response: " + response),
error -> System.err.println("Error: " + error.getMessage())
);
// 为了让程序不立即退出,等待一段时间
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static Observable<String> callApiWithParams(String param) {
return Observable.just(param)
.map(p -> {
// 这里模拟API调用,可能会失败
if (Math.random() > 0.5) {
throw new RuntimeException("API call failed for param: " + p);
}
return "Success with param: " + p;
});
}
}
在这个示例中,callApiWithParams
方法模拟了一个可能会失败的 API 调用。我们使用 Observable.merge
来并行执行两个 API 调用,并且每个调用使用不同的参数。
retryWhen
操作符用于在发生错误时重试。在这个例子中,我们设置了最多重试三次,每次重试前等待的时间逐渐增加(第一次等待2秒,第二次等待4秒,第三次等待6秒)。如果在三次重试后仍然失败,则抛出异常。
请注意,这个示例代码是为了演示目的而简化的。在实际应用中,你需要根据你的具体需求来调整重试逻辑和错误处理。
优势:
retryWhen
提供了灵活的错误处理机制。类型:
Observable
:最常用的类型,可以发出0个或多个数据项,也可以发出一个错误通知或完成通知。Single
:只能发出一个数据项或一个错误通知。Maybe
:可以发出0个或1个数据项,也可以发出一个错误通知。Completable
:不发出任何数据项,只发出完成通知或错误通知。应用场景:
如果你遇到了具体的问题,比如重试逻辑没有按预期工作,你需要检查你的重试条件和错误处理逻辑是否正确设置。确保你的 retryWhen
操作符中的逻辑能够正确捕获和处理异常,并且在适当的时候触发重试。
领取专属 10元无门槛券
手把手带您无忧上云