欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解决Java处理HTTP请求超时的问题

程序员文章站 2022-03-27 08:35:40
在发送post或get请求时,返回超时异常处理办法:捕获 sockettimeoutexception | connecttimeoutexception | connectionpooltimeou...

在发送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+"连接无法关闭");
      }
 }
 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。