How to implement a retry mechanism in jersey-client java
Asked Answered
J

1

8

I am doing some http rest api calls using jersey-client. Now I want to do a retry for a failure request. Say if the return error code is not 200 then I want to retry it again for a few times. How can do it using Jersey client

Jilleen answered 27/7, 2015 at 10:54 Comment(2)
jersey-client won't do that for you. Use a loop.Alcazar
You can use Apache http client, again you need to validate the response code and re-issue the request.Yesman
M
3

Late to the party here, but there are a couple different mechanisms you can use. A synchronous method would look something like this:

public Response execWithBackoff(Callable<Response> i) {
    ExponentialBackOff backoff = new ExponentialBackOff.Builder().build();

    long delay = 0;

    Response response;
    do {
        try {
            Thread.sleep(delay);

            response = i.call();

            if (response.getStatusInfo().getFamily() == Family.SERVER_ERROR) {
                log.warn("Server error {} when accessing path {}. Delaying {}ms", response.getStatus(), response.getLocation().toASCIIString(), delay);
            }

            delay = backoff.nextBackOffMillis();
        } catch (Exception e) { //callable throws exception
            throw new RuntimeException("Client request failed", e);
        }

    } while (delay != ExponentialBackOff.STOP && response.getStatusInfo().getFamily() == Family.SERVER_ERROR);

    if (response.getStatusInfo().getFamily() == Family.SERVER_ERROR) {
        throw new IllegalStateException("Client request failed for " + response.getLocation().toASCIIString());
    }

    return response;
}

The exponential backoff implementation is based off of Googles client library: https://developers.google.com/api-client-library/java/google-http-java-client/backoff

Moina answered 15/1, 2016 at 2:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.