2017-08-30 91 views
1

我正在使用Vertx RxJava訂戶使用REST api。我想在發生特定錯誤時重試請求,下面是我的代碼。 當我運行這個,重試不斷髮生,我寧願讓它重試三次。RxJava:使用retryWhen()重試訂戶

我是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

您不必使用retryWhenretry是不夠好。

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

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

如果內重試表達式返回true

+0

由於它會重試!這工作。 – Rakesh

+0

你是welocme – Praveen

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; 
     });