Java 异步HTTP后重试和最大重试次数后耗尽
在多次异步请求调用失败后,如何重试? 我正在使用发送请求到我们的服务器。在请求超时、连接异常等情况下,我希望客户端重试N次并抛出一个自定义异常。调用方法应接收此异常,或者可以不处理此异常Java 异步HTTP后重试和最大重试次数后耗尽,java,asynchttpclient,Java,Asynchttpclient,在多次异步请求调用失败后,如何重试? 我正在使用发送请求到我们的服务器。在请求超时、连接异常等情况下,我希望客户端重试N次并抛出一个自定义异常。调用方法应接收此异常,或者可以不处理此异常 //调用post 公共void调用(字符串数据)引发CustomException{ asyncHttpClient.post(数据,10); } //将数据发布到http端点 public void post(字符串数据,整数重试)引发CustomException{ //如果重试次数已用尽,则抛出Cust
//调用post
公共void调用(字符串数据)引发CustomException{
asyncHttpClient.post(数据,10);
}
//将数据发布到http端点
public void post(字符串数据,整数重试)引发CustomException{
//如果重试次数已用尽,则抛出CustomException以调用()
如果(重试){
响应=空;
int status=0;
试一试{
response=responseFuture.get();
status=response.getStatusCode();
//HTTP_ACCEPTED={200201202}
if(ArrayUtils.contains(HTTP_已接受,状态)){
//嗯
}否则{
睡眠(10);
post(数据,重试-1);
}
}捕捉(中断异常e){
睡眠(10);
post(数据,重试-1);
}捕获(执行例外){
//连接异常
//RequestTimeoutException
睡眠(10);//10秒
post(数据,重试-1);
}捕获(例外e){
睡眠(10);//10秒
post(数据,重试-1);
}最后{
responseFuture.done();
}
},Runnable::run);
}
这种方法有几个问题:
CustomException
似乎从未抛出,重试==0后,控件返回到finally
块好的,所以我试着用代码重现您试图实现的功能,但立即意识到您的
CustomException
只有在类型为RuntimeException
时才有效。原因是您希望在运行时和其他线程中引发异常
下面的代码显示了异常的一个简单实现。请记住,并非所有运行时异常都会停止程序。本文对此进行了解释。因此,如果你想终止程序,你必须手动停止它
public class CustomException extends RuntimeException {
public CustomException(String msg) {
super(msg);
// print your exception to the console
// optional: exit the program
System.exit(0);
}
}
我更改了实现的其余部分,这样您就不必再进行递归调用了。我删除了回调方法,而是调用get()
方法,该方法等待请求完成。但由于我在一个单独的线程中执行所有这些,所以它应该在后台运行,而不是在主线程中运行
公共类主{
私有最终异步httpClient httpClient;
私有最终int[]HTTP_ACCEPTED=newint[]{200201202};
私有最终静态字符串终结点=”https://postman-echo.com/post";
公共静态void main(字符串[]args){
String data=“{message:'Hello World'}”;
Main m=新的Main();
m、 员额(数据,10);
}
公用干管(){
httpClient=异步httpClient();
}
公共无效post(最终字符串数据,最终整型重试){
Runnable Runnable=()->{
int retries=重试;
for(int i=0;i
AsyncHttpClient中有一个预定义的函数来处理MaxRetries
下面的代码显示了一个简单的实现
AsyncHttpClientConfig cf = new DefaultAsyncHttpClientConfig.Builder().setMaxRequestRetry(5).setKeepAlive(true).build()
final AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(cf);
您可以删除自己的重试逻辑,并让AsyncHttpClient处理相同的逻辑。在某些情况下,您可以使用抛出新的RuntimeException(ee)来代替抛出e
您使用的是什么软件包或库?改造?okhttp?截击完整地解释您的代码和专门使用这些代码的包。什么是
responseFuture
的实例?该声明未包含在提供的代码中。它是ListenableFuture
的一个实例,编辑了代码。到目前为止,您对这两个答案的满意度如何?在您的最后一个代码片段(问题#2下面)中,您在一个封闭的catch(ExecutionException e){…}
块中执行catch(ExecutionException e){…}
操作。但是在较大的第一个代码片段中,CustomException
显示的唯一位置是if(重试),这会阻止对responseFuture.get()的执行,对吗?。在这种情况下,我们可以使用同步http客户机。我添加了一个替代方法
AsyncHttpClientConfig cf = new DefaultAsyncHttpClientConfig.Builder().setMaxRequestRetry(5).setKeepAlive(true).build()
final AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(cf);
catch (ExecutionException e) {
Throwable ee = e.getCause ();
if (ee instanceof InvalidInputException)
{
//error handling 1
} else if (ee instanceof MiscalculationException e)
{
//error handling 2
}
else throw e; // Not ee here
}