Java 异步HTTP后重试和最大重试次数后耗尽

Java 异步HTTP后重试和最大重试次数后耗尽,java,asynchttpclient,Java,Asynchttpclient,在多次异步请求调用失败后,如何重试? 我正在使用发送请求到我们的服务器。在请求超时、连接异常等情况下,我希望客户端重试N次并抛出一个自定义异常。调用方法应接收此异常,或者可以不处理此异常 //调用post 公共void调用(字符串数据)引发CustomException{ asyncHttpClient.post(数据,10); } //将数据发布到http端点 public void post(字符串数据,整数重试)引发CustomException{ //如果重试次数已用尽,则抛出Cust

在多次异步请求调用失败后,如何重试? 我正在使用发送请求到我们的服务器。在请求超时、连接异常等情况下,我希望客户端重试N次并抛出一个自定义异常。调用方法应接收此异常,或者可以不处理此异常

//调用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
    }