HttpClient在使用中有两个超时时间,是一直接触和使用的,由于上次工作中使用httpClient造成了系统悲剧的情况,特地对它的两个超时时间进行了小小的测试,在这里记录下。
测试版本为HttpClient——3.1
一:连接超时:connectionTimeout
1:指的是连接一个url的连接等待时间。
2:设置方法为:
public class TestHttpClientMain {
-
publicstaticvoidmain(String[]args){
-
HttpClientclient=newHttpClient();
-
HttpMethodmethod=newGetMethod(
-
"http://test.com");
- client.getHttpConnectionManager().getParams()
-
.setConnectionTimeout(3000);
-
client.getHttpConnectionManager().getParams().setSoTimeout(3000);
-
try{
-
intstatusCode=client.executeMethod(method);
- System.out.println(statusCode);
-
byte[]responseBody=null;
- responseBody=method.getResponseBody();
-
Stringresult=newString(responseBody);
- System.out.println(result);
-
}catch(HttpExceptione){
-
- e.printStackTrace();
-
}catch(IOExceptione){
-
- 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
- atorg.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:155)
-
atorg.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
-
atorg.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
-
atorg.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
-
atorg.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
-
atorg.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
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 {
-
publicstaticvoidmain(String[]args){
-
HttpClientclient=newHttpClient();
-
HttpMethodmethod=newGetMethod(
-
"http://localhost:8080/firstTest.htm?method=test");
- client.getHttpConnectionManager().getParams()
-
.setConnectionTimeout(3000);
-
client.getHttpConnectionManager().getParams().setSoTimeout(2000);
-
try{
-
intstatusCode=client.executeMethod(method);
- System.out.println(statusCode);
-
byte[]responseBody=null;
- responseBody=method.getResponseBody();
-
Stringresult=newString(responseBody);
- System.out.println(result);
-
}catch(HttpExceptione){
-
- e.printStackTrace();
-
}catch(IOExceptione){
-
- e.printStackTrace();
- }
- }
3:测试的时候的连接url为我本地开启的一个url,http://localhost:8080/firstTest.htm?method=test
在我这个测试url里,当访问到这个链接时,线程sleep一段时间,来模拟返回response超时。
@RequestMapping(params = "method=test") //<——②
- publicStringtestMethod(ModelMapmodel){
-
try{
-
Thread.sleep(3000);
-
}catch(InterruptedExceptione){
-
- e.printStackTrace();
- }
-
System.out.println("calltestMethodmethod.");
-
model.addAttribute("name","testmethod");
-
return"test";
- }
4:将读取response返回超时时间设的时间比那个sleep时间短之后,运行程序给出异常:
java.net.SocketTimeoutException: Read timed out
- atjava.net.SocketInputStream.socketRead0(NativeMethod)
- atjava.net.SocketInputStream.read(UnknownSource)
- atjava.io.BufferedInputStream.fill(UnknownSource)
- atjava.io.BufferedInputStream.read(UnknownSource)
-
atorg.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
-
atorg.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
-
atorg.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
-
atorg.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
-
atorg.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
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这两个超时时间一定要加上,不加就很可能悲剧的了。
分享到:
相关推荐
Java HTTPClient 设置超时时间和代理的方法 Java HTTPClient 是一个功能强大且灵活的 HTTP 客户端库,提供了许多实用的功能来处理 HTTP 请求。其中,设置超时时间和代理是两个非常重要的配置项,本文将详细介绍如何...
在这个主题中,我们将深入探讨HttpClient的用法,特别是如何获取客户端信息并发送回服务器。 首先,让我们了解如何初始化HttpClient实例。HttpClient的使用通常始于创建一个HttpClient对象。你可以使用`HttpClients...
这篇博客文章“HTTPClient用法”可能是关于如何使用Apache HttpClient库进行HTTP通信的教程,虽然具体内容没有给出,但我们可以根据常见的HTTPClient使用场景和方法来探讨相关知识点。 1. **Apache HttpClient简介*...
标题中的“对于C#(HttpClient)方式网络请求的封装”是指使用C#编程语言,特别是通过HttpClient类来处理HTTP网络请求,并将这个过程进行抽象和封装,以便在多个地方重复使用。HttpClient是.NET Framework和.NET ...
本教程将基于标题"HTTPClient简单使用"和提供的文件`HttpService`、`HttpClient`来阐述HTTPClient的基本使用方法。 1. **HTTPClient简介** HTTPClient是Apache的 HttpClient库,它为Java开发者提供了全面的HTTP...
本教程将深入讲解如何在使用HttpClient时进行精细的超时控制,这对于处理长时间运行的请求或者优化应用性能至关重要。本文档主要面向C#开发者,但对Java开发者也有一定的参考价值,因为两者都属于面向对象编程语言,...
本篇文章将详细讲解HttpClient的使用方法,包括如何搭建环境、所需的jar包、基本应用以及实例演示,旨在帮助初级学员快速掌握HttpClient的基础操作。 一、环境搭建 在使用HttpClient之前,首先需要在项目中引入...
HttpClient库允许开发者执行各种HTTP方法(如GET、POST、PUT等),处理重定向、认证、cookie管理等复杂网络交互,同时提供了线程安全和高效的连接管理机制。这个库在处理Web服务API、爬虫程序或任何需要与HTTP服务器...
1. **初始化配置**:根据项目需求设置HttpClient实例的配置,如连接超时、读写超时、最大连接数、重试策略等。 2. **创建HttpClient实例**:使用`HttpClientBuilder`或者`HttpAsyncClientBuilder`构建器进行实例化。...
HttpClientHelper 对这个类进行了封装,使得开发者无需直接与HttpClient接口打交道,而是通过更简洁、易用的方法调用来实现网络通信。这提高了代码的可读性和可维护性。 单例模式是软件设计模式的一种,确保一个类...
10. **配置和定制**:HttpClient具有高度可配置性,可以根据项目需求调整连接超时、读取超时、连接池大小等参数。 在实际使用中,开发者还需要根据项目的具体需求,考虑是否需要引入其他辅助库,如处理JSON的Gson或...
首先,HttpClient库提供了一套完整的API,允许开发者构建复杂的HTTP请求,包括GET、POST、PUT等HTTP方法,同时支持连接管理、重试策略、超时设置等高级特性。在Java项目中,HttpClient通常被用来替代内置的`java.net...
在本文中,我们将深入探讨HttpClient的核心概念、使用方法以及如何通过`httpclient.jar`进行实战应用。 首先,HttpClient的主要组件包括: 1. **HttpClient实例**:这是整个HTTP通信的核心,负责管理连接、请求和...
创建`HttpClient`实例通常是通过静态`HttpClientFactory`方法或直接实例化`HttpClient`完成的。为了确保高效的资源管理,建议使用`HttpClientFactory`,尤其是对于频繁创建和销毁`HttpClient`的情况,这可以避免过多...
10. **性能优化**:通过配置连接超时、响应超时、线程池大小等参数,以及使用合适的连接管理策略,可以进一步优化HttpClient的性能。 在实际使用HttpClient时,需要根据项目需求选择合适的版本,理解其工作原理,...
在实际应用中,你需要根据项目需求配置HttpClient实例,例如选择合适的连接管理器、设置超时、添加身份验证等。同时,注意HttpClient库已经不再更新,对于新的Java项目,推荐使用现代化的HTTP客户端库,如Apache ...
在本文中,我们将深入探讨HttpClient的主要特性和使用方法,以及如何利用它来处理HTTP协议的各种操作。 HttpClient支持多种HTTP方法,如GET、POST、PUT、DELETE等,可以方便地进行HTTP头的设置,发送cookies,处理...
- **HttpClient 资源释放:** 为确保程序的健壮性,必须妥善管理HttpClient使用的各种资源,包括Socket连接等,以避免资源泄露的问题。 - **HTTP 执行上下文:** HTTP执行上下文是HttpClient中的一个重要概念,它...
1. **创建HttpClient实例**:首先,需要创建一个HttpClient实例,可以设置连接超时、重试策略等参数。 2. **选择HttpMethod**:根据实际需求选择合适的HttpMethod,比如使用GetMethod或PostMethod。 3. **设置请求...