Hi All,
I have a strange problem with timeout handling in httpclient 3.1.
For a client I am connecting to his backoffice at some url with basic
authentication. Everything works fine, until I set the timeouts.
If I don't set timeouts, the call will complete in 1000-2000ms. If I set
the timeouts to 4000ms, the calls will ALWAYS take more than 4000ms to
complete, most of the time even 8000+.
I tested with different other urls of my own (with authentication,
without, etc). If I use a url managed by myself on my own server, the
timeout setting work fine.
What could be causing this strange delay?
I am running jdk 1.5.0 on Windows XP SP2.
Here's the code I use. The urls and credentials in the code are from my
own testserver (and working for outside world).
public class TestCommunicator {
public static void main(String[] args) throws Exception {
String requestXmlAsString = "<xml><name>Some bogus xml for
this test</name></xml>";
for (int i = 0; i<250; i++) {
requestXmlAsString += "<xml><name>Some bogus xml for
this test</name></xml>";
}
System.out.println("REQUEST=");
System.out.println(requestXmlAsString);
long processStartTime = System.currentTimeMillis();
HttpClient httpClient = new HttpClient();
httpClient.getParams().setAuthenticationPreemptive(true);
Credentials credentials = new
UsernamePasswordCredentials("valentijn", "testvalentijn");
httpClient.getState().setCredentials(new
AuthScope("62.212.90.124" , 443 , AuthScope.ANY_REALM), credentials);
PostMethod pm = new
PostMethod("https://62.212.90.124/valentijn/");
pm.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
pm.addRequestHeader("Content-Type",
"application/x-sap.busdoc");
pm.setDoAuthentication(true);
pm.setRequestEntity(new
StringRequestEntity(requestXmlAsString));
Integer connectionTimeout = 4000;
pm.getParams().setParameter("http.socket.timeout",
connectionTimeout);
pm.getParams().setParameter("http.connection.timeout",
connectionTimeout);
httpClient.getParams().setParameter("http.socket.timeout",
connectionTimeout);
httpClient.getParams().setParameter("http.connection.timeout",
connectionTimeout);
try {
// Send and parse
int httpResponseCode = httpClient.executeMethod(pm);
if(httpResponseCode == 200){
// Get responsebody as XML
System.out.println("RESPONSE=");
System.out.println(pm.getResponseBodyAsString());
long processEndTime =
System.currentTimeMillis();
System.out.println (">>> This action took :
" + (processEndTime-processStartTime) + " ms.");
} else{
// The responsedata may be an XML form. If so,
create a nice, readable XML file. Otherwise,
// just return the responsedata as a String
object.
String responseBody = "";
System.out.println("RESPONSE=");
System.out.println(pm.getResponseBodyAsString());
long processEndTime =
System.currentTimeMillis();
System.out.println (">>> This action took : " +
(processEndTime-processStartTime) + " ms.");
throw new Exception("Wrong responsecode
returned.");
}
} catch (HttpException e) {
e.printStackTrace();
long processEndTime = System.currentTimeMillis();
System.out.println (">>> This action took : " +
(processEndTime-processStartTime) + " ms.");
} catch (IOException e) {
e.printStackTrace();
long processEndTime = System.currentTimeMillis();
System.out.println (">>> This action took : " +
(processEndTime-processStartTime) + " ms.");
}
}
}
Met vriendelijke groet / With kind regards,
ir Valentijn Scholten
Applicatie Architect
ISAAC Software Solutions
e-mail: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
url: http://www.isaac.nl <http://www.isaac.nl/>
tel: +31 (0)40-2155357
fax: +31 (0)40-2908980