gpt4 book ai didi

java - 异步 HTTP 后重试和最大重试后耗尽

转载 作者:行者123 更新时间:2023-12-02 19:12:45 26 4
gpt4 key购买 nike

在多次失败的异步请求调用后,如何耗尽重试次数?我正在使用AsyncHttpClient向我们的服务器发送请求。如果出现请求超时、连接异常等情况,我希望客户端重试 N 次并抛出自定义异常。调用方法应该接收此异常,否则可以不处理它。

// calls post
public void call(String data) throws CustomException {

asyncHttpClient.post(data, 10);

}
// posts data to http endpoint
public void post(String data, int retries) throw CustomException {
// if retries are exhausted, throw CustomException to call()
if (retry <= 0) {
throw new CustomException("exc");
}

BoundRequest request = httpClient.preparePost("http_endpoint");
ListenableFuture<Response> responseFuture = httpClient.post(request);

responseFuture.addListener(() -> {
Response response = null;
int status = 0;
try {

response = responseFuture.get();
status = response.getStatusCode();

// HTTP_ACCEPTED = {200, 201, 202}
if (ArrayUtils.contains(HTTP_ACCEPTED, status)) {
// ok
} else {
sleep(10);
post(data, retry - 1);
}
} catch (InterruptedException e) {
sleep(10);
post(data, retry - 1);

} catch (ExecutionException e) {
// ConnectionException
// RequestTimeoutException
sleep(10); // 10 seconds
post(data, retry - 1);
} catch (Exception e) {
sleep(10); // 10 seconds
post(data, retry - 1 );
} finally {
responseFuture.done();
}
}, Runnable::run);

}

这种方法有一些问题:

  1. 使用递归调用来重试。
  2. CustomException 似乎永远不会抛出,并且在重试 == 0 后,控制返回到 finally block 。
...
} catch (ExecutionException e) {
// ConnectionException
// RequestTimeoutException
sleep(10); // 10 seconds
try {
post(data, retry - 1);
} catch (CustomException e) {
}
}
...

最佳答案

AsyncHttpClient中有一个预定义的函数来处理MaxRetries,

下面的代码显示了一个简单的实现

AsyncHttpClientConfig cf = new DefaultAsyncHttpClientConfig.Builder().setMaxRequestRetry(5).setKeepAlive(true).build()
final AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(cf);

您可以删除自己的重试逻辑并让 AsyncHttpClient 处理相同的内容。

关于java - 异步 HTTP 后重试和最大重试后耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64040323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com