解决Java处理HTTP请求超时的问题
在发送post或get请求时,返回超时异常处理办法:
捕获 sockettimeoutexception | connecttimeoutexception | connectionpooltimeout 异常
三种异常说明:
sockettimeoutexception
:是java包下抛出的异常,这定义了socket读数据的超时时间,即从server获取响应数据须要等待的时间;当读取或者接收socket超时会抛出sockettimeoutexception。
connecttimeoutexception
:是apache的httpclient包抛出的超时异常,定义了通过网络与server建立连接的超时时间,httpclient包中通过一个异步线程去创建与server的socket连接,这就是该socket连接的超时时;
当连接httpserver或者等待httpconnectionmanager管理的一个有效连接超时出错会抛出connectiontimeoutexception。
connectionpooltimeout
:也是apache的httpclient包抛出的超时异常,定义了从 connectionmanager 管理的连接池中取出连接的超时时间;出错会抛出 connectionpooltimeoutexception。
总结:
sockettimeoutexception异常是一个通用的异常,无论是用原生的http请求,还是用apache下的httpclient包,在抛出的异常中都需要捕获 sockettimeoutexception 异常。
例:
public static string doget(string url, object params, string contenttype) { try { return httputils.dogetsend(url, params, contenttype); } catch (sockettimeoutexception | connecttimeoutexception e) { e.printstacktrace(); system.out.println("请求连接超时:" + e.getmessage()); } catch (ioexception e) { e.printstacktrace(); system.out.println("请求异常,异常信息:" + e.getmessage()); } catch (exception e) { e.printstacktrace(); } return null; }
补充:java 发送http请求(连接超时处理)
业务背景:
某项目跟第三方公司对接。
业务描述:
出于数据安全考虑,需要从服务器发送请求,来调用第三方公司提供的接口。但是该场景是销售类型,响应时间必须够快,那么就要设置响应的超时处理。
不然让客户看着圈圈在那里转半天,谁买?
项目架构:
jdk1.7
spring4.2.9
详细内容:
closeablehttpclient httpclient = httpclients.createdefault(); try { httppost httppost = new httppost(要访问的url); //配置超时 requestconfig requestconfig = requestconfig.custom() .setconnecttimeout(5000).setconnectionrequesttimeout(5000) .setsockettimeout(5000).build(); httppost.setconfig(requestconfig); //设置post请求参数 list<namevaluepair> nvps = new arraylist<namevaluepair>(); nvps.add(new basicnamevaluepair("attr1", 参数值1)); nvps.add(new basicnamevaluepair("attr2", 参数值2)); nvps.add(new basicnamevaluepair("attr3", 参数值3)); …… httppost.setentity(new urlencodedformentity(nvps)); //执行post请求 closeablehttpresponse response = httpclient.execute(httppost); // 判断网络连接状态码是否正常(0--200都数正常) if(response.getstatusline().getstatuscode() == httpstatus.sc_ok){ //获取响应实体 responsemessage = entityutils.tostring(response.getentity(),"utf-8"); system.out.println(responsemessage); if(responsemessage!=null && !"".equals(responsemessage)){ string data = new string(aesutil.decrypt(base64.decode(responsemessage), key),"utf-8"); string msg = translate_pre(data,trans_type,transno); result.put("msg", msg); } }else{ system.out.println("请求未成功响应: "+ response.getstatusline()); } } catch (connecttimeoutexception e) { system.out.println(api_type+"请求超时"); } catch (clientprotocolexception e) { system.out.println("请求失败"); } catch (exception e) { e.printstacktrace(); } finally { //释放连接 try { if(httpclient!=null){ httpclient.close(); } } catch (ioexception e) { system.out.println(api_type+"连接无法关闭"); } } .setconnecttimeout(5000).setconnectionrequesttimeout(5000) .setsockettimeout(5000).build(); httppost.setconfig(requestconfig); //设置post请求参数 list<namevaluepair> nvps = new arraylist<namevaluepair>(); nvps.add(new basicnamevaluepair("attr1", 参数值1)); nvps.add(new basicnamevaluepair("attr2", 参数值2)); nvps.add(new basicnamevaluepair("attr3", 参数值3)); …… httppost.setentity(new urlencodedformentity(nvps)); //执行post请求 closeablehttpresponse response = httpclient.execute(httppost); // 判断网络连接状态码是否正常(0--200都数正常) if(response.getstatusline().getstatuscode() == httpstatus.sc_ok){ //获取响应实体 responsemessage = entityutils.tostring(response.getentity(),"utf-8"); system.out.println(responsemessage); if(responsemessage!=null && !"".equals(responsemessage)){ string data = new string(aesutil.decrypt(base64.decode(responsemessage), key),"utf-8"); string msg = translate_pre(data,trans_type,transno); result.put("msg", msg); } }else{ system.out.println("请求未成功响应: "+ response.getstatusline()); } } catch (connecttimeoutexception e) { system.out.println(api_type+"请求超时"); } catch (clientprotocolexception e) { system.out.println("请求失败"); } catch (exception e) { e.printstacktrace(); } finally { //释放连接 try { if(httpclient!=null){ httpclient.close(); } } catch (ioexception e) { system.out.println(api_type+"连接无法关闭"); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
下一篇: Android中检查、设置默认程序详解
推荐阅读
-
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
-
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
-
Java Http请求传json数据乱码问题的解决
-
php中curl和soap方式请求服务超时问题的解决
-
Go中http超时问题的排查及解决方法
-
解决Python发送Http请求时,中文乱码的问题
-
HTTP的GET请求RUL保留字处理方式(多个解决方案)
-
SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理
-
springmvc 处理http get/post请求中文乱码的问题
-
java JDK1.7的HTTPConnection请求Connection reset问题解决