首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在jersey-client java中实现重试机制

如何在jersey-client java中实现重试机制
EN

Stack Overflow用户
提问于 2015-07-27 18:54:54
回答 2查看 15K关注 0票数 7

我正在使用jersey-client进行一些http rest api调用。现在,我想对失败的请求进行重试。假设返回的错误代码不是200,那么我想重试几次。如何使用Jersey客户端完成此操作

EN

回答 2

Stack Overflow用户

发布于 2015-08-01 00:31:31

要在任何情况下实现重试,请查看Failsafe

代码语言:javascript
复制
RetryPolicy retryPolicy = new RetryPolicy()
  .retryIf((ClientResponse response) -> response.getStatus() != 200)
  .withDelay(1, TimeUnit.SECONDS)
  .withMaxRetries(3);

Failsafe.with(retryPolicy).get(() -> webResource.post(ClientResponse.class, input));

此示例在响应状态!= 200时重试,最多3次,两次重试之间的延迟为1秒。

票数 9
EN

Stack Overflow用户

发布于 2016-01-15 10:46:32

晚到这里,但有几种不同的机制你可以使用。同步方法看起来像这样:

代码语言:javascript
复制
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;
}

指数回退实现基于Google客户端库:https://developers.google.com/api-client-library/java/google-http-java-client/backoff

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31651236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档