解决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+"连接无法关闭");
      }
 }
 

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

(0)

相关推荐

  • Java 如何使用Feign发送HTTP请求

    在往常的 HTTP 调用中,一直都是使用的官方提供的 RestTemplate 来进行远程调用,该调用方式将组装代码冗余到正常业务代码中,不够优雅,因此在接触到 Feign 后,考虑使其作为一个 HTTP 发送基础,来进行远程调用. 下面就让我们来看一下,其是如何使用的. 引入依赖 首先,我们需要将 Feign 的基础依赖引入项目,因为我们只使用 Feign 的 remote 功能,因此,只引入基础依赖. 此外在项目中,我们还自定义了了 JSON 转换和 log 设置,因此还需要引入这些的第三方

  • JAVA发送HTTP请求的四种方式总结

    源代码:http://github.com/lovewenyo/HttpDemo 1. HttpURLConnection 使用JDK原生提供的net,无需其他jar包: HttpURLConnection是URLConnection的子类,提供更多的方法,使用更方便. package httpURLConnection; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamRe

  • Java发起http请求的完整步骤记录

    前言 在未来做项目中,一些功能模块可能会采用不同的语言进行编写.这就需要http请求进行模块的调用.那么下面,我将以Java为例,详细说明如何发起http请求. 一.GET与POST GET和POST是HTTP的两个常用方法. GET指从指定的服务器中获取数据 POST指提交数据给指定的服务器处理 1.GET方法 使用GET方法,需要传递的参数被附加在URL地址后面一起发送到服务器. 例如:http://121.41.111.94/submit?name=zxy&age=21 特点: GET请求

  • 如何劫持Java应用的HTTP请求

    背景 全链路追踪中,针对部分特殊的流量,希望将它引导到特定服务上(这个特定服务不在正常请求的链路上)--问题可以被抽象为解决进程间通信过程中目标进程的选择. 进程间通信方式很多,本篇只关注 Java 进程间套接字通信下 HTTP 形式的请求劫持,引导特定流量到特定进程. 解决方案 可行的处理方案繁多.自顶向下从应用.框架.JVM.Container Runtime.System Call.网络协议栈等级别,均可着手解决.侵入性最强的操作就是要求所有业务应用都主动实现 HTTP 请求分流逻辑:次一

  • Java 发送http请求(get、post)的示例

    1.情景展示 java发送get请求.post请求(form表单.json数据)至另一服务器: 可设置HTTP请求头部信息,可以接收服务器返回cookie信息,可以上传文件等: 2.代码实现 所需jar包:httpcore-4.4.1.jar:httpclient-4.4.1.jar:httpmime-4.4.1.jar:epoint-utils-9.3.3.jar import java.io.File; import java.io.IOException; import java.io.I

  • Java发送http请求的示例(get与post方法请求)

    package com.jiucool.www.struts.action;  import java.io.BufferedReader;  import java.io.DataOutputStream;  import java.io.File;  import java.io.FileReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.HttpURLConnect

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

    在发送POST或GET请求时,返回超时异常处理办法: 捕获 SocketTimeoutException | ConnectTimeoutException | ConnectionPoolTimeout 异常 三种异常说明: SocketTimeoutException:是Java包下抛出的异常,这定义了Socket读数据的超时时间,即从server获取响应数据须要等待的时间:当读取或者接收Socket超时会抛出SocketTimeoutException. ConnectTimeoutExc

  • java网络爬虫连接超时解决实例代码

    本文研究的主要是java网络爬虫连接超时的问题,具体如下. 在网络爬虫中,经常会遇到如下报错.即连接超时.针对此问题,一般解决思路为:将连接时间.请求时间设置长一下.如果出现连接超时的情况,则在重新请求[设置重新请求次数]. Exception in thread "main" java.net.ConnectException: Connection timed out: connect 下面的代码便是使用httpclient解决连接超时的样例程序.直接上程序. package da

  • SQL Server 磁盘请求超时的833错误原因及解决方法

    最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的errorlog中出现磁盘请求超过15s才完成的error消息. 对于此类问题,到底是存储系统或者磁盘的故障,还是SQL Server 自己的问题,亦或是应用程序引发的呢?又要如何解决? 本文将对引起此问题的某一方面的因素进行简单的分析,但是无法涵盖所有潜在的可能性,因此遇到类似问题还要做具体的分析. SQL Server中的磁盘请求超时 该错误的英文版的错误信息如下: SQL Server has e

  • 解决java使用axios.js的post请求后台时无法接收到入参的问题

    使用vue有一段时间了,下面是我在Java环境下使用vue+axios的时候遇到的一个坑,在这分享给大家,如有不正确或者疑惑的地方可以给我留言. 1.在使用异步请求后台时,由于官方不在更新vue-resource,推荐使用axios,因此在使用的时候难免会遇到各种问题.目前遇到最大的问题是在使用axios.post的请求向Java后端传入入参时,后端无法接收到参数.在这里主要处理移动端浏览器兼容的问题. 在这里我提供了两种解决办法: 一.URLSearchParams.append()方法 由于

  • 解决Shiro 处理ajax请求拦截登录超时的问题

    目录 Shiro 处理ajax请求拦截登录超时 配置全局ajax配置 Shiro session超时页面跳转的处理 问题描述 ajax请求超时处理 后端Filter代码 前端通用ajax处理 非ajax请求超时跳转 Shiro 处理ajax请求拦截登录超时 配置全局ajax配置 $.ajaxSetup({ complete:function(XMLHttpRequest,textStatus){ if(textStatus=="parsererror"){ $.messager.ale

  • Java网络编程教程之设置请求超时的方法

    一.引言 随着企业系统的发展,应用多采用分布式结构,严重依赖于网络的稳定性.但由于网络天生的不稳定性,系统开发过程中需要考虑网络不稳定情况下如何保证应用的鲁棒性. 设置网络超时是其中一种保证应用健壮性的手段. 设置网络超时设置后,请求在设定时间能未完成将被强制终止,保证程序不出现无限制的线程阻塞情况,有效的提高了应用的可用性. 下面话不多说了,来一起看看详细的介绍吧. 二.未设置超时与设置超时情况对比 1. 网络请求图例: 网络请求超时案例 2. 设置超时时间后,请求图例: 网络请求超时案例-设

  • java返回json请求中文变成问号的问题及解决

    目录 java返回json请求中文变成问号 json返回中文全是问号 java返回json请求中文变成问号 原来在个人项目时,用layui的数据表格获取数据时,不会出现中文变问号问题 后来换了个项目,发现返回的json数据到页面中文变成了???问号. 于是开始排查问题出现的原因,首先jsp页面头部确保使用了UTF-8编码: <%@ page language="java" contentType="text/html; charset=UTF-8" pageE

  • java发送HttpClient请求及接收请求结果过程的简单实例

    一. 1.写一个HttpRequestUtils工具类,包括post请求和get请求 package com.brainlong.framework.util.httpclient; import net.sf.json.JSONObject; import org.apache.commons.httpclient.HttpStatus; import org.apache.http.HttpResponse; import org.apache.http.client.methods.Htt

  • 解决vue中axios设置超时(超过5分钟)没反应的问题

    (chrome环境)在做项目的时候,由于做大数据可视化界面,后台接口查询数据往往会比较久(上百万的数据量),导致vue项目axios请求超时timeout设置就比较大.开始设置超时未3分钟时没有问题(这里我设置超时弹窗了),可设置超时未6分钟时,却在五分钟左右弹出请求超时,但明明设置tiemout=6x60x1000. 于是通过资料查询,了解到Chrome浏览器,默认请求超时为五分钟,所以导致上诉现象产生,可如何在vue中修改浏览器超时? 直接上代码: 我们可以在config文件中index.j

  • 解决Java中的java.io.IOException: Broken pipe问题

    Java 中java.io.IOException: Broken pipe 认识broken pipe pipe是管道的意思,管道里面是数据流,通常是从文件或网络套接字读取的数据. 当该管道从另一端突然关闭时,会发生数据突然中断,即是broken. 对于文件File来说,这可能是文件安装在已断开连接的光盘或远程网络上. 对于socket来说,可能是网络被拔出或另一端的进程崩溃. 在Java中,没有具体的BrokenPipeException. 将此类错误包含在另一个异常,例如java.io.I

随机推荐