java - RX Java - 重试一些抛出异常的代码

标签 java error-handling rx-java observable exponential-backoff

我正在尝试使用 RX Java 来使用来自不断发送对象的源的一些数据。

我想知道如何为我自己的代码抛出异常的情况实现重试策略。例如,网络异常应该使用指数退避策略触发重试。

一些代码:

 message.map(this::processMessage)
                 .subscribe((message)->{
                     //do something after mapping
                 });

processMessage(message) 是包含可能失败的风险代码的方法,它是我想重试的代码部分,但我不想阻止 observable 从源中使用数据.

对此有什么想法吗?

最佳答案

message
    .map(this::processMessage)
    .retryWhen(errors -> errors.flatMap(error -> {  
        if (error instanceof IOException) {
          return Observable.just(null);
        }
        // For anything else, don't retry
        return Observable.error(error);
     })
     .subscribe(
         System.out::println,
         error -> System.out.println("Error!")
     );

或者捕获错误

message.map(this::processMessage)
           .onErrorReturn(error -> "Empty result")
           .subscribe((message)->{})

或处理错误

message
    .map(this::processMessage)
    .doOnError(throwable -> Log.e(TAG, "Throwable " + throwable.getMessage()))
    .subscribe(
         System.out::println,
         error -> System.out.println("Error!")
     );

未经测试,但 retryWhen 与 repeatWhen 不同,它不仅在 onComplete 中调用。

http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/ -> 每个错误都是平面映射的,因此我们可以返回 onNext(null)(触发重新订阅)或 onError(error)(避免重新订阅)。

退避政策:

source.retryWhen(errors ->  
  errors
    .zipWith(Observable.range(1, 3), (n, i) -> i)
    .flatMap(retryCount -> Observable.timer((long) Math.pow(5, retryCount), TimeUnit.SECONDS))
);

在这种情况下,flatMap + 计时器比延迟更可取,因为它允许我们通过重试次数修改延迟。上述重试 3 次,每次重试延迟 5 ^ retryCount,只需少量运算符即可实现指数退避!

关于java - RX Java - 重试一些抛出异常的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623002/

相关文章:

java - JPA 对所有者的多对多合并触发对连接表的删除

java - 尝试理解代码:的逻辑

python - 可变深度词典的KeyError处理

javascript - 当您无法控制时如何规避同源策略错误

linux - 如何安装 Proc::Daemon 模块

android - 如何为单元测试选择正确的调度程序

java - 使用 JavaParser 使用 getExtendedType 查找继承

java - 如何结合Swing和SpringFramework?

rx-java - 我应该如何处理 RxJava 中的副作用?

java - 响应式(Reactive)编程中的订阅是什么