Hi,
We are using commons-httpclient 2.01 that does send and receive
simple post-requests && response . Unfortunately we get sometimes the
following error java.net.SocketTimeoutException: Read timed out
05-19-08 14:40:29:812|Service-0|java.net.SocketTimeoutException: Read
timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at java.io.PushbackInputStream.read(Unknown Source)
at
org.apache.commons.httpclient.WireLogInputStream.read(WireLogInputStream.java:71)
at java.io.FilterInputStream.read(Unknown Source)
at
org.apache.commons.httpclient.ContentLengthInputStream.read(ContentLengthInputStream.java:135)
at java.io.FilterInputStream.read(Unknown Source)
at
org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:110)
at com.test.TestHttpClient.execute(TestHttpClient.java:49)
at com.test.TestThread.run(TestThread.java:34)
at java.lang.Thread.run(Unknown Source)
The code is listed below:
TestHttpClient.java
............
public void execute() throws IOException
{
String url = "http://www.xxx.com/test";
String request = "args1=abc, args2=abc";
String result = null;
PostMethod method = new PostMethod(url);
InputStream data = new ByteArrayInputStream(request.getBytes());
DefaultMethodRetryHandler retryhandler = new
DefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled(true);
retryhandler.setRetryCount( 3 ); // retry 3 times
method.setRequestBody(data);
method.setFollowRedirects(true);
method.setMethodRetryHandler(retryhandler);
MultiThreadedHttpConnectionManager hcm = new
MultiThreadedHttpConnectionManager();
hcm.setConnectionStaleCheckingEnabled( true );
hcm.setMaxConnectionsPerHost(1);
HttpClient httpClient = new HttpClient( hcm );
httpClient.setConnectionTimeout( 300000);
httpClient.setTimeout( 300000);
try {
// set the proxy url
httpClient.getHostConfiguration().setProxy("192.168.0.100",
8000);
// execute the method
int code = httpClient.executeMethod(method);
if (code == HttpStatus.SC_OK) {
byte[] responseBody = new byte[10240];
InputStream istream = method.getResponseBodyAsStream();
int pos = 0;
int read = 0;
while ((read = istream.read(responseBody, pos,
responseBody.length - pos)) >= 0) {
pos += read;
if (pos >= responseBody.length) {
byte[] tmp = new byte[pos + INC_BODY_SIZE];
System.arraycopy(responseBody, 0, tmp, 0, pos);
responseBody = tmp;
}
}
result = new String(responseBody, 0, pos);
}
} finally {
method.releaseConnection();
}
System.out.println("The result is :" + result);
}
We tried to use these in a thread and sometimes the SocketTimeout
exception was thrown. I added logs and found that the exception was
thrown in :
while ((read = istream.read(responseBody, pos, responseBody.length -
pos)) >= 0) {
........
}
}
Why the InputStream.read() throw a Socket timeout exception? We may
not update the HttpClient to the newest version, maybe we can do it
later. So we try to solve the problem
with 2.01. Any suggestion? Thanks in advance.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]