`

[转]HttpClient的超时用法小记

阅读更多
原文 http://blog.163.com/xing_mu_1/blog/static/6614290201032084947978/

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) 




分享到:
评论

相关推荐

    httpclient用法,发送get和post请求,设置header

    httpclient的用法,发送get请求和post请求,设置header

    HttpClient用法

    在这个主题中,我们将深入探讨HttpClient的用法,特别是如何获取客户端信息并发送回服务器。 首先,让我们了解如何初始化HttpClient实例。HttpClient的使用通常始于创建一个HttpClient对象。你可以使用`HttpClients...

    HttpClient用法,实例

    HttpClient用法,实例 HttpClient用法,实例 HttpClient用法,实例 HttpClient用法,实例

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

    在.NET 6中,HttpClient是...通过以上方式,你可以有效地在.NET 6中使用HttpClient进行HTTP请求,并通过设置超时机制来防止因网络延迟导致的长时间等待。结合Polly这样的库,可以进一步提升应用程序的稳定性和可靠性。

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

    标题中的“对于C#(HttpClient)方式网络请求的封装”是指使用C#编程语言,特别是通过HttpClient类来处理HTTP网络请求,并将这个过程进行抽象和封装,以便在多个地方重复使用。HttpClient是.NET Framework和.NET ...

    【ASP.NET编程知识】.NET CORE HttpClient的使用方法.docx

    .NET CORE HttpClient 的使用方法 .NET CORE 中的 HttpClient 是一个非常重要的组件,它提供了一个强大且灵活的方式来发送 HTTP 请求。然而,在使用 HttpClient 时,我们需要注意一些重要的配置和使用方法,以避免...

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

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

    HTTPClient用法

    这篇博客文章“HTTPClient用法”可能是关于如何使用Apache HttpClient库进行HTTP通信的教程,虽然具体内容没有给出,但我们可以根据常见的HTTPClient使用场景和方法来探讨相关知识点。 1. **Apache HttpClient简介*...

    HttpClient各种使用方法

    NULL 博文链接:https://wenkaixuan.iteye.com/blog/2109590

    HttpClient 基本用法

    下面将详细讲解HttpClient的基本用法,尤其是GET方法的使用。 首先,创建一个HttpClient的实例,这是所有操作的基础。通常,我们可以使用默认构造函数创建一个HttpClient对象,如下所示: ```java HttpClient ...

    httpclient-4.5.6-API文档-中文版.zip

    赠送jar包:httpclient-4.5.6.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    httpclient简单使用

    本教程将基于标题"HTTPClient简单使用"和提供的文件`HttpService`、`HttpClient`来阐述HTTPClient的基本使用方法。 1. **HTTPClient简介** HTTPClient是Apache的 HttpClient库,它为Java开发者提供了全面的HTTP...

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

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

    httpClient组件使用说明

    本篇文章将详细讲解HttpClient的使用方法,包括如何搭建环境、所需的jar包、基本应用以及实例演示,旨在帮助初级学员快速掌握HttpClient的基础操作。 一、环境搭建 在使用HttpClient之前,首先需要在项目中引入...

    HttpClientHelper 工具类

    HttpClientHelper 对这个类进行了封装,使得开发者无需直接与HttpClient接口打交道,而是通过更简洁、易用的方法调用来实现网络通信。这提高了代码的可读性和可维护性。 单例模式是软件设计模式的一种,确保一个类...

    使用httpclient访问servlet

    使用HttpClient的`execute(HttpUriRequest request)`方法发送请求。这个方法会返回一个`HttpResponse`对象,其中包含了服务器的响应。 5. **处理响应**: 从`HttpResponse`中获取状态码(`getStatusLine()....

    HTTPClient 的一个封装

    1. **初始化配置**:根据项目需求设置HttpClient实例的配置,如连接超时、读写超时、最大连接数、重试策略等。 2. **创建HttpClient实例**:使用`HttpClientBuilder`或者`HttpAsyncClientBuilder`构建器进行实例化。...

    httpclient.jar包下载

    在使用httpclient.jar时,开发者需要注意版本兼容性,因为不同的HttpClient版本可能与不同的Java版本和服务器环境有不同的适配性。此外,理解HttpClient的配置和设置非常重要,这直接影响到其性能和功能。例如,正确...

    httpclient httpclient.jar

    在本文中,我们将深入探讨HttpClient的核心概念、使用方法以及如何通过`httpclient.jar`进行实战应用。 首先,HttpClient的主要组件包括: 1. **HttpClient实例**:这是整个HTTP通信的核心,负责管理连接、请求和...

Global site tag (gtag.js) - Google Analytics