FULL PRODUCT VERSION :
java version "1.5.0_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode, sharing)
A DESCRIPTION OF THE PROBLEM :
When the system property sun.net.client.defaultReadTimeout is set it is supposed to cause an SocketTimeoutException to be thrown if the timeout is passed. However it appears that after a URLConnection is used once setting the property does nothing
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
First run the beanshell script provided. Notice no exception is thrown. Then uncomment the first System.setProperty(). Now an Exception is thrown on the first run.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
If we wait to set the property after the first run, a timeout should occur in the second run.
ACTUAL -
If we don't set it before the first run we can't set it ever
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
#! /usr/local/jdk/bin/java bsh.Interpreter
//import java.net.URLConnection;
String getFromBF(Reader bf) {
final int ca_size = 1024;
StringBuffer answer = new StringBuffer();
char[] ca = new char[ca_size];
int read = 0; //declared outside loop so the while() can access it.
int total = 0;
do {
read = bf.read(ca,0,ca_size);
if (read > 0){
answer.append(ca,0,read);//append chars we just read to answer.
total += read;
}
//if we read in less chars than we asked for, or -1 for end of stream, exit loop.
} while (read >= ca_size );
bf.close();
return answer.toString();
}
url = new java.net.URL("http://login.m.xtenit.com/timeout.jsp?to=7000");
//System.setProperty("sun.net.client.defaultReadTimeout","6000");
conn = url.openConnection() ;
System.out.println("classname: "+conn.getClass().getName());
System.out.println("response code: "+conn.getResponseCode()) ;
is = conn.getInputStream() ;
s = getFromBF(new InputStreamReader(is));
System.out.println(s);
System.setProperty("sun.net.client.defaultReadTimeout","6000");
// now do it again
System.setProperty("sun.net.client.defaultReadTimeout","6000");
conn = url.openConnection() ;
System.out.println("classname: "+conn.getClass().getName());
System.out.println("response code: "+conn.getResponseCode()) ;
is = conn.getInputStream() ;
s = getFromBF(new InputStreamReader(is));
System.out.println(s);
System.setProperty("sun.net.client.defaultReadTimeout","6000");
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
In jdk 1.5 there won't be as much need to use properties, but this should still work.
###@###.### 2005-03-24 17:19:42 GMT