`

HttpClient 超时

 
阅读更多
HttpClient的超时用法小记 

2010-04-20 20:49:47|  分类: 默认分类 |字号 订阅
HttpClient在使用中有两个超时时间,是一直接触和使用的,由于上次工作中使用httpClient造成了系统悲剧的情况,特地对它的两个超时时间进行了小小的测试,在这里记录下。


     测试版本为HttpClient——3.1



     一:连接超时:connectionTimeout



     1:指的是连接一个url的连接等待时间。



     2:设置方法为:



     public class TestHttpClientMain {

/**
  * @param args
  */
public static void main(String[] args) {
  HttpClient client = new HttpClient();

  HttpMethod method = new GetMethod(
    "http://test.com");
  client.getHttpConnectionManager().getParams()
    .setConnectionTimeout(3000);
  client.getHttpConnectionManager().getParams().setSoTimeout(3000);
  try {
   int statusCode = client.executeMethod(method);
   System.out.println(statusCode);

   byte[] responseBody = null;

   responseBody = method.getResponseBody();

   String result = new String(responseBody);

   System.out.println(result);

  } catch (HttpException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
}
}



     3:测试的时候,将url改为一个不存在的url:“http://test.com”



     4:超时时间3000ms过后,系统报出异常。



     org.apache.commons.httpclient.ConnectTimeoutException: The host did not accept the connection within timeout of 3000 ms

at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:155)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)



     二:读取数据超时:soTimeout



     1:指的是连接上一个url,获取response的返回等待时间



     2:设置方法



     public class TestHttpClientMain {

/**
  * @param args
  */
public static void main(String[] args) {
  HttpClient client = new HttpClient();

  HttpMethod method = new GetMethod(
    "http://localhost:8080/firstTest.htm?method=test");
  client.getHttpConnectionManager().getParams()
    .setConnectionTimeout(3000);
  client.getHttpConnectionManager().getParams().setSoTimeout(2000);
  try {
   int statusCode = client.executeMethod(method);
   System.out.println(statusCode);

   byte[] responseBody = null;

   responseBody = method.getResponseBody();

   String result = new String(responseBody);

   System.out.println(result);

  } catch (HttpException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
}
}



     3:测试的时候的连接url为我本地开启的一个url,http://localhost:8080/firstTest.htm?method=test



     在我这个测试url里,当访问到这个链接时,线程sleep一段时间,来模拟返回response超时。



     @RequestMapping(params = "method=test") //<——②

    public String testMethod(ModelMap model) {
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
        System.out.println("call testMethod method.");
        model.addAttribute("name", "test method");
  return "test";
    }




     4:将读取response返回超时时间设的时间比那个sleep时间短之后,运行程序给出异常:



      java.net.SocketTimeoutException: Read timed out

at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)





     ok,以后再写httpClient这两个超时时间一定要加上,不加就很可能悲剧的了。
分享到:
评论

相关推荐

    对于C#(HttpClient)方式网络请求的封装

    4. **超时设置**:可能会提到如何设置请求超时,以防止因服务器响应过慢导致程序阻塞。 5. **异步编程**:由于Unity游戏引擎推荐使用异步操作以避免阻塞主线程,所以会涉及使用async/await关键字来实现非阻塞的网络...

    HTTPClient

    HttpClient超时设置 **2.1 概览** 在实际应用中,有时我们需要对HTTP请求设置超时时间以避免长时间等待响应导致的问题。本节将介绍如何在HttpClient中配置不同的超时策略。 **2.2 通过原始字符串参数配置超时** ...

    超时处理abc

    2. **HttpClient超时**:在使用Apache HttpClient或者Java内置的`HttpURLConnection`进行HTTP请求时,可以分别通过`HttpClient`的`RequestConfig`或`HttpURLConnection`的`setConnectTimeout(int timeout)`和`...

    dotnet 6 使用 HttpClient 的超时机制.rar

    本教程将详细讲解如何在.NET 6中利用HttpClient设置超时机制,确保你的请求处理在预设时间内完成,避免程序因长时间等待响应而卡死。 HttpClient类提供了发送HTTP请求的能力,同时允许开发者配置请求的多个方面,...

    java httpclient设置超时时间和代理的方法

    Java HTTPClient 设置超时时间和代理的方法 Java HTTPClient 是一个功能强大且灵活的 HTTP 客户端库,提供了许多实用的功能来处理 HTTP 请求。其中,设置超时时间和代理是两个非常重要的配置项,本文将详细介绍如何...

    dotnet 6 精细控制 HttpClient 网络请求超时.rar

    本教程将深入讲解如何在使用HttpClient时进行精细的超时控制,这对于处理长时间运行的请求或者优化应用性能至关重要。本文档主要面向C#开发者,但对Java开发者也有一定的参考价值,因为两者都属于面向对象编程语言,...

    httpclient.jar包下载

    例如,正确设置连接超时、读取超时以及连接池大小,可以避免因网络延迟导致的问题。 在实际开发中,我们可以通过Maven或Gradle等构建工具来管理和依赖httpclient.jar,确保依赖的版本一致性,并且可以方便地升级或...

    联合永道java面试题.pdf

    1. HTTPClient超时设置 在使用HTTPClient访问远程地址并提交数据时,超时的原因主要有两个:一是建立网络连接慢,二是虽然成功建立连接但是对方页面处理过慢,返回数据超时。因此,超时设置需要针对这两个过程分别...

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

    在 Spring 框架中,可以使用 HttpClient 来设置网络超时。下面是一个使用 HttpClient 设置网络超时的示例代码: ```java &lt;bean id="multiThreadedHttpConnectionManager" class="org.apache.commons.httpclient....

    HttpClient4.5.1手册

    ### HttpClient4.5.1 手册知识点概览 #### 一、基础知识 **1.1 请求执行** - **HTTP请求:** 在客户端与服务器之间的交互过程中,客户端发送的每一条消息都称为一个请求。HTTP请求由三部分组成:请求行、请求头...

    httpClient需要的jar包

    10. **性能优化**:通过配置连接超时、响应超时、线程池大小等参数,以及使用合适的连接管理策略,可以进一步优化HttpClient的性能。 在实际使用HttpClient时,需要根据项目需求选择合适的版本,理解其工作原理,...

    HttpClientHelper 工具类

    6. **HTTP请求配置**:可能还提供了设置超时、添加HTTP头、携带Cookie等功能,以适应不同的请求需求。 综上所述,HttpClientHelper 是一个实用的HTTP客户端工具类,结合了HttpClient的强大功能和单例模式的高效管理...

    httpclient httpclient.jar

    通常,我们创建一个HttpClient实例,并设置其配置参数,如连接超时、重试策略等。 2. **HttpHost**:表示目标HTTP服务器的信息,包括主机名、端口和协议(HTTP或HTTPS)。 3. **HttpGet/HttpPost**:这些是执行...

    httpclient

    可以通过设置连接超时、读写超时、最大连接数、连接复用策略等来优化HttpClient的性能。 10. **异步操作**: HttpClient也支持异步操作,通过`HttpAsyncClient`类,可以在回调函数中处理响应,适合于高并发场景。...

    HttpClient重新封装的HttpClient类

    然而,这个基础版本的`HttpClient`存在一些问题,如资源管理不当可能导致泄露,以及缺少重试和超时策略等。因此,对`HttpClient`进行重新封装是非常常见的实践,以解决这些问题并增加额外的功能。 重新封装的`...

    httpclient4.2.1.zip

    除了基本的HTTP请求,HttpClient还支持更复杂的操作,如文件上传、下载、分块传输、自定义HTTP头、超时设置等。例如,使用HttpPost进行表单数据提交: ```java HttpPost httpPost = new HttpPost(...

    apache httpclient jar包

    - **HttpClient实例**:创建HttpClient对象是执行HTTP请求的第一步,它可以配置各种设置,如连接超时、重试策略等。 - **HttpHost**:表示一个HTTP或HTTPS服务器,包括主机名、端口号和协议。 - **...

    Arduino HttpClient 库文件

    此外,HTTP 请求可能受网络条件、服务器响应时间和 Arduino 的处理能力等因素影响,需要适当处理超时和错误情况。 在实际项目中,HttpClient 库常用于 IoT(物联网)场景,如远程控制、数据采集或设备状态报告等。...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    1. **创建HttpClient实例**:首先,需要创建一个HttpClient实例,可以设置连接超时、重试策略等参数。 2. **选择HttpMethod**:根据实际需求选择合适的HttpMethod,比如使用GetMethod或PostMethod。 3. **设置请求...

    Httpclient依赖包

    4. **性能优化**:合理配置连接池大小、超时时间、重试策略等参数,可以显著提升HttpClient的性能。 5. **线程安全**:HttpClient实例不是线程安全的,如果在多线程环境中使用,需要为每个线程创建独立的HttpClient...

Global site tag (gtag.js) - Google Analytics