RxJava:使用 retryWhen() 重试订阅者

RxJava : Retrying a subscriber using retryWhen()

我正在使用 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;
        });

只需添加 .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;
        });

您不必使用 retryWhenretry 就足够了。

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

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

里面的表达式重试会重试returnstrue