connectionTimeout与soTimeout的差异,前者指创建一个有效的客户端到服务端链接的最大允许时间,后者指socket接收data的时间。
connectionManager.getParams().setConnectionTimeout(50);
connectionManager.getParams().setSoTimeout(100);
调用connectionTimeout属性的代码:
//org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory
public static Socket createSocket(final SocketTask task, int timeout)
throws IOException, UnknownHostException, ConnectTimeoutException{
try {
TimeoutController.execute(task, timeout);
} catch (TimeoutController.TimeoutException e) {
throw new ConnectTimeoutException(
"The host did not accept the connection within timeout of "
+ timeout + " ms");
}
Socket socket = task.getSocket();
if (task.exception != null) {
throw task.exception;
}
return socket;
}
//org.apache.commons.httpclient.util.TimeoutController
public static void execute(Thread task, long timeout) throws TimeoutException {
task.start();
try {
task.join(timeout);
} catch (InterruptedException e) {
/* if somebody interrupts us he knows what he is doing */
}
if (task.isAlive()) {
task.interrupt();
throw new TimeoutException();
}
}
调用soTimeout属性的代码:
socket.setSoTimeout(this.params.getSoTimeout());
* HttpClient.executeMethod(method) 主要代码逻辑:
1 public int executeMethod(HostConfiguration hostconfig,
2 final HttpMethod method, final HttpState state)
3 throws IOException, HttpException {
4
5 LOG.trace("enter HttpClient.executeMethod(HostConfiguration,HttpMethod,HttpState)");
6
7 if (method == null) {
8 throw new IllegalArgumentException("HttpMethod parameter may not be null");
9 }
10 HostConfiguration defaulthostconfig = getHostConfiguration();
11 if (hostconfig == null) {
12 hostconfig = defaulthostconfig;
13 }
14 URI uri = method.getURI();
15 if (hostconfig == defaulthostconfig || uri.isAbsoluteURI()) {
16 // make a deep copy of the host defaults17 hostconfig = (HostConfiguration) hostconfig.clone();
18 if (uri.isAbsoluteURI()) {
19 hostconfig.setHost(uri);
20 }
21 }
22
23 HttpMethodDirector methodDirector = new HttpMethodDirector(
24 getHttpConnectionManager(),
25 hostconfig,
26 this.params,
27 (state == null ? getState() : state));
28 methodDirector.executeMethod(method);
29 return method.getStatusCode();
30 }
31
32 //------------------------------
33
34 /**
35 * Executes the method associated with this method director.
36 *
37 * @throws IOException
38 * @throws HttpException
39 */
40 public void executeMethod(final HttpMethod method) throws IOException, HttpException {
41 //...
42 try {
43 int maxRedirects = this.params.getIntParameter(HttpClientParams.MAX_REDIRECTS, 100);
44
45 for (int redirectCount = 0;;) {
46
47 // make sure the connection we have is appropriate
48 if (this.conn != null && !hostConfiguration.hostEquals(this.conn)) {
49 this.conn.setLocked(false);
50 this.conn.releaseConnection();
51 this.conn = null;
52 }
53
54 // get a connection, if we need one
55 if (this.conn == null) {
56 this.conn = connectionManager.getConnectionWithTimeout(
57 hostConfiguration,
58 this.params.getConnectionManagerTimeout()
59 );
60 this.conn.setLocked(true);
61 if (this.params.isAuthenticationPreemptive()
62 || this.state.isAuthenticationPreemptive())
63 {
64 LOG.debug("Preemptively sending default basic credentials");
65 method.getHostAuthState().setPreemptive();
66 method.getHostAuthState().setAuthAttempted(true);
67 if (this.conn.isProxied() && !this.conn.isSecure()) {
68 method.getProxyAuthState().setPreemptive();
69 method.getProxyAuthState().setAuthAttempted(true);
70 }
71 }
72 }
73 } finally {
74 if (this.conn != null) {
75 this.conn.setLocked(false);
76 }
77 // If the response has been fully processed, return the connection
78 // to the pool. Use this flag, rather than other tests (like
79 // responseStream == null), as subclasses, might reset the stream,
80 // for example, reading the entire response into a file and then
81 // setting the file as the stream.
82 if (
83 (releaseConnection || method.getResponseBodyAsStream() == null)
84 && this.conn != null
85 ) {
86 this.conn.releaseConnection();
87 }
88 }
89
90 }
91
92 //-------------------------- this.conn = connectionManager.getConnectionWithTimeout
93
94 public HttpConnection getConnectionWithTimeout(HostConfiguration hostConfiguration,
95 long timeout) throws ConnectionPoolTimeoutException {
96 //...
97 final HttpConnection conn = doGetConnection(hostConfiguration, timeout);
98
99 // wrap the connection in an adapter so we can ensure it is used
100 // only once
101 return new HttpConnectionAdapter(conn);
102 }
commons-httpclient中的超时设置