Retry logic with CompletableFuture

后端 未结 7 2156
别跟我提以往
别跟我提以往 2021-01-31 18:26

I need to submit a task in an async framework I\'m working on, but I need to catch for exceptions, and retry the same task multiple times before \"aborting\".

The code I

7条回答
  •  悲&欢浪女
    2021-01-31 19:20

    maybe it's late but hopes someone might find this useful, I recently solved this problem for retrying rest API call on failure. In my case, I have to retry on 500 HTTP status code, below is my rest client code (we are using WSClient from play framework) you can change it to whatever rest-client as per requirement.

     int MAX_RETRY = 3;
     CompletableFuture future = new CompletableFuture<>();
    
     private CompletionStage getWS(Object request,String url, int retry, CompletableFuture future) throws JsonProcessingException {
     ws.url(url)
            .post(Json.parse(mapper.writeValueAsString(request)))
            .whenCompleteAsync((wsResponse, exception) -> {
                if(wsResponse.getStatus() == 500 && retry < MAX_RETRY) {
                    try {
                        getWS(request, retry+1, future);
                    } catch (IOException e) {
                        throw new Exception(e);
                    }
                }else {
                    future.complete(wsResponse);
                }
            });
    
         return future;
    }
    

    This code will return immediately if the status code is 200 or other than 500 whereas if HTTP status is 500 it will retry 3 times.

提交回复
热议问题