java HttpRequest : java.util.concurrent.TimeoutException after multiple recursive request

Viewed 26

I have this code, It uses the java java.net.http.HttpClient :

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class test {
    private static String authorizationHeader = "Bearer ";
    public static int MAX_RESEND = 5;
    public static int TIME_OUT = 150000;

    public static String url = "http://127.0.0.1:5000/api/test";

    private static final HttpClient httpClient = HttpClient.newBuilder()
            .version(HttpClient.Version.HTTP_1_1)
            .connectTimeout(Duration.ofMinutes(3))
            .build();
    public static HTTPResponse postHttpRequest(HttpClient httpClient, String uri, String body){
        HttpResponse.BodyHandler<String> handler = HttpResponse.BodyHandlers.ofString();

        HttpRequest request = HttpRequest.newBuilder()
                .version(HttpClient.Version.HTTP_1_1)
                .timeout(Duration.ofMinutes(5))
                .uri(URI.create(uri))
                .header("Content-Type", "application/json")
                .header("Authorization", authorizationHeader)
                .POST(HttpRequest.BodyPublishers.ofString(body))
                .build();

        CompletableFuture<HttpResponse<String>> response = httpClient.sendAsync(request, handler)
                .thenComposeAsync(r -> tryResend(httpClient, request, handler, 1, r, TIME_OUT));

        String getResponse = null;
        Integer getResponseStatusCode = null;
        try {
            getResponse = response.thenApply(HttpResponse::body).get(3, TimeUnit.MINUTES);
            getResponseStatusCode = response.get().statusCode();
            
            return new HTTPResponse(getResponseStatusCode, getResponse, null) ;
        } catch (Exception e) {
            return new HTTPResponse(500, e.toString(), e.getMessage());
        }
    }
    public static <T> CompletableFuture<HttpResponse<T>> tryResend(HttpClient client, HttpRequest request, HttpResponse.BodyHandler<T> handler, int count, HttpResponse<T> resp, long timeSleep) {
        try {
            Thread.sleep(timeSleep);
            if (resp.statusCode() == 200 || count >= MAX_RESEND) {
                return CompletableFuture.completedFuture(resp);
            } else {
                return client.sendAsync(request, handler)
                        .thenComposeAsync(r -> tryResend(client, request, handler, count+1, r, timeSleep));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {

        String body = "{\"app\":\"hi\"}";
        HTTPResponse hResponseOrigin = postHttpRequest( httpClient , url , body);
        Integer statusCodeOriginResponse = hResponseOrigin.getStatusCode();
        String msgOriginResponse = hResponseOrigin.getResponse();
    }
}

class HTTPResponse {

    private Integer statusCode;
    private String response;
    private String exception;

    public HTTPResponse(Integer statusCode, String response, String exception) {
        this.statusCode = statusCode;
        this.response = response;
        this.exception = exception;
    }

    public Integer getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(Integer statusCode) {
        this.statusCode = statusCode;
    }

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }

    public String getException() {
        return exception;
    }

    public void setException(String exception) {
        this.exception = exception;
    }
}

The code tries to do n recursive-requests when the first response of the request is not 200.

The issue always appears on the second retry. I always get this exception:

java.util.concurrent.TimeoutException

example:

postHttpRequest ---------------------------
http://127.0.0.1:5000/api/test
tryResend ------------------------------------------------------
count zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
1
res get tryResend ----------zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxx
{"app":"hi"}
status code: 500
tryResend ------------------------------------------------------
count zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
2
res get tryResend ----------zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxx
{"app":"hi"}
msgOriginResponse xxxxxxxxxxxxxxxx----------------------------------------------------------------xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
java.util.concurrent.TimeoutException
msgOriginResponse end xxxxxxxxxxxxxxxxx----------------------------------------------------------------xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

How can I fix it?? any recomendation ?

0 Answers
Related