RxJava:使用retryWhen()

时间:2017-08-30 15:27:13

标签: rx-java vert.x

我正在使用Vertx RxJava订阅者使用REST API。我想在有特定错误时重试请求,下面是我的代码。 当我运行它时,重试会无限发生,我宁愿重试三次。

我是RxJava的新手,仍然以Rx方式做事。 有人能告诉我是否遗漏了什么吗?谢谢!

responseSingle.map(response -> {
            //do some stuff
            return responseBody;

        }).retryWhen(errors -> {
                    errors.flatMap(error -> {
                        log.info("==================== caught error ==================== ");
                        // For IOExceptions, we  retry
                        if (error instanceof MySpecificException) {
                            log.info("==================== retrying request ==================== ");
                            return Observable.just(null);
                        }

                        // For anything else, don't retry
                        return errors;
                    });
                    return errors;
                }
        ).onErrorReturn(t -> {
            //do some stuff
            return responseBody;
        });

2 个答案:

答案 0 :(得分:2)

您不必使用retryWhen,而retry就足够了。

responseSingle.map(response -> {
        //do some stuff
        return responseBody;

    })
    .retry((attempts,error) -> attempts<3 && error instanceof MySpecificException)  
    .onErrorReturn(t -> {
        //do some stuff
        return responseBody;
    });

如果重试中的表达式返回true

,它将重试

答案 1 :(得分:0)

只需添加.retry(count),未经测试但应该可以使用。

responseSingle.map(response -> {
            //do some stuff
            return responseBody;

        })
                .retry(3) // count of retries
                .retryWhen(errors -> {
                    errors.flatMap(error -> {
                        log.info("==================== caught error ==================== ");
                        // For IOExceptions, we  retry
                        if (error instanceof MySpecificException) {
                            log.info("==================== retrying request ==================== ");
                            return Observable.just(null);
                        }

                        // For anything else, don't retry
                        return errors;
                    });
                    return errors;
                }
        ).onErrorReturn(t -> {
            //do some stuff
            return responseBody;
        });