Java 如果在指定时间内没有收到响应,如何关闭API连接
我正在调用一个API来获取响应,但如果API关闭,我的请求将挂起,直到API打开,控制才会返回。一旦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。在其中
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;
}
希望这有帮助 假设您没有使用任何特定的框架,那么应该在请求上设置超时,而不是在响应中设置超时。我认为这个线程有你正在寻找的解决方案