Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在指定时间内没有收到响应,如何关闭API连接_Java_Jakarta Ee_Io_Struts2_Httpclient - Fatal编程技术网

Java 如果在指定时间内没有收到响应,如何关闭API连接

Java 如果在指定时间内没有收到响应,如何关闭API连接,java,jakarta-ee,io,struts2,httpclient,Java,Jakarta Ee,Io,Struts2,Httpclient,我正在调用一个API来获取响应,但如果API关闭,我的请求将挂起,直到API打开,控制才会返回。一旦API启动并运行,所有被挂起的请求都会立即被发送到它,然后我们就会得到响应 我的要求如下: 1.调用API 2.等待15秒以获得响应 3.如果我在15秒内没有得到响应,请执行某些操作(例如:抛出异常) 4.关闭我已连接的连接。 请帮助编写代码片段。 我尝试过使用CloseableHttpClient、HttpResponse、CloseableHttpResponse。尝试使用OKHTTP。在其中

我正在调用一个API来获取响应,但如果API关闭,我的请求将挂起,直到API打开,控制才会返回。一旦API启动并运行,所有被挂起的请求都会立即被发送到它,然后我们就会得到响应

我的要求如下:
1.调用API
2.等待15秒以获得响应
3.如果我在15秒内没有得到响应,请执行某些操作(例如:抛出异常)
4.关闭我已连接的连接。

请帮助编写代码片段。

我尝试过使用CloseableHttpClient、HttpResponse、CloseableHttpResponse。

尝试使用OKHTTP。在其中,您的代码将如下所示

new Response.Builder()
                   .code(600) //Simply put whatever value you want to designate to aborted request.
                   .request(chain.request())
                   .build();

我的建议是使用一般解决方案

(如果找不到合适的超时变量来设置和解决问题,请使用此选项)

您可以在API调用中使用
java.util.concurrent.Future
。请看一个教程

此外,这里是我自己的例子:

public String callLongRunOpperation() throws Exception {
             final  long EXECUTION_TIMEOUT = 8L;
             java.util.concurrent.Future <Object> future; 
             java.util.concurrent.ExecutorService executorService = java.util.concurrent.Executors.newFixedThreadPool(1);
             final String res;   
             future = executorService.submit(new java.util.concurrent.Callable<Object>() { 
                   public Object call() throws Exception {
                     return longrunApiCall();
                   }
                 });
               //execute 
                try {
                       res = (String) future.get(EXECUTION_TIMEOUT, java.util.concurrent.TimeUnit.SECONDS); 
                    } catch (java.util.concurrent.ExecutionException ex) { 
                        ex.printStackTrace();
                         // handle execution exception here
                    }
                      catch (InterruptedException ee){
                          ee.printStackTrace();
                         // handle interrupt here
                    }
                       catch (java.util.concurrent.TimeoutException te){
                          // handle timeout here
                          te.printStackTrace();
                    }
                     finally {
                          future.cancel(true);
                          executorService.shutdown();
                    }               
              return res;
         }
public String callLongRunUpperation()引发异常{
最终长时间执行\u超时=8L;
java.util.concurrent.Future;
java.util.concurrent.ExecutorService ExecutorService=java.util.concurrent.Executors.newFixedThreadPool(1);
最终字符串res;
future=executorService.submit(新java.util.concurrent.Callable(){
公共对象调用()引发异常{
返回longrunApiCall();
}
});
//执行
试一试{
res=(字符串)future.get(执行超时,java.util.concurrent.TimeUnit.SECONDS);
}catch(java.util.concurrent.ExecutionException ex){
例如printStackTrace();
//在此处理执行异常
}
捕获(中断异常ee){
ee.printStackTrace();
//在这里处理中断
}
catch(java.util.concurrent.TimeoutException te){
//在这里处理超时
te.printStackTrace();
}
最后{
future.cancel(true);
executorService.shutdown();
}               
返回res;
}

希望这有帮助

假设您没有使用任何特定的框架,那么应该在请求上设置超时,而不是在响应中设置超时。我认为这个线程有你正在寻找的解决方案