Hello,
Today Sylvain's blog is down, which is causing infinite timeout on
my Cocoon-based portal...
This is why you will find attached a patch to implement timeout on
URLSource. The problem is that HttpURLConnection timeout in the
JDK is only available in JDK 1.5:
http://java.sun.com/j2se/1.5.0/docs/api/java/net/HttpURLConnection.html
How to achieve this cleanly?
--
Jean-Baptiste Quenot
http://caraldi.com/jbq/
Index:
components/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSourceFactory.java
===================================================================
---
components/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSourceFactory.java
(revision 375548)
+++
components/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSourceFactory.java
(working copy)
@@ -22,6 +22,9 @@
import java.util.Map;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.parameters.ParameterException;
+import org.apache.avalon.framework.parameters.Parameterizable;
+import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceFactory;
@@ -37,16 +40,29 @@
* @author <a href="mailto:[email protected]">Avalon Development Team</a>
* @version $Id: URLSourceFactory.java,v 1.4 2004/02/28 11:47:24 cziegeler Exp
$
*/
-public class URLSourceFactory extends AbstractLogEnabled implements
SourceFactory, ThreadSafe
+public class URLSourceFactory extends AbstractLogEnabled implements
Parameterizable, SourceFactory, ThreadSafe
{
+ Parameters parameters;
- /**
+ /**
+ * Accept configuration parameters:
+ * <ul>
+ * <li><tt>connect-timeout</tt> used for
<tt>setConnectTimeout()</tt></li>
+ * <li><tt>read-timeout</tt> used for <tt>setReadTimeout()</tt></li>
+ * </ul>
+ */
+ public void parameterize(Parameters par) throws ParameterException {
+ this.parameters = par;
+ }
+
+ /**
* Create an URL-based source. This class actually creates an [EMAIL
PROTECTED] URLSource}, but if another
* implementation is needed, subclasses can override this method.
*/
protected Source createURLSource(URL url, Map parameters) throws
MalformedURLException, IOException
{
URLSource result = new URLSource();
+ result.parameterize(this.parameters);
result.init(url, parameters);
return result;
}
Index:
components/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSource.java
===================================================================
---
components/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSource.java
(revision 375548)
+++
components/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSource.java
(working copy)
@@ -26,6 +26,8 @@
import java.util.Iterator;
import java.util.Map;
+import org.apache.avalon.framework.parameters.ParameterException;
+import org.apache.avalon.framework.parameters.Parameters;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceParameters;
@@ -42,6 +44,9 @@
*/
public class URLSource extends AbstractSource implements Source
{
+ private static final String CONNECT_TIMEOUT = "connect-timeout";
+ private static final String READ_TIMEOUT = "read-timeout";
+ int connectTimeout, readTimeout;
/** The URL of the source */
protected URL m_url;
@@ -68,6 +73,8 @@
/** The content type (if known) */
protected String m_mimeType;
+
+ Parameters avalonParameters;
/**
* Constructor
@@ -107,6 +114,11 @@
if (encoding != null && !"".equals(encoding))
m_encoding = encoding;
}
+
+ if (null != avalonParameters) {
+ connectTimeout =
avalonParameters.getParameterAsInteger(CONNECT_TIMEOUT, -1);
+ readTimeout = avalonParameters.getParameterAsInteger(READ_TIMEOUT,
-1);
+ }
if (null != m_parameters && m_parameters.hasParameters() && !m_isPost)
{
@@ -139,6 +151,17 @@
}
}
+ /**
+ * Accept configuration parameters:
+ * <ul>
+ * <li><tt>connect-timeout</tt> used for
<tt>setConnectTimeout()</tt></li>
+ * <li><tt>read-timeout</tt> used for <tt>setReadTimeout()</tt></li>
+ * </ul>
+ */
+ public void parameterize(Parameters par) {
+ this.avalonParameters = par;
+ }
+
/**
* Get the last modification date and content length of the source.
* Any exceptions are ignored.
@@ -160,6 +183,10 @@
if (m_url.getProtocol().startsWith("http") && userInfo !=
null){
m_connection.setRequestProperty("Authorization",
"Basic " + SourceUtil.encodeBASE64(userInfo));
}
+ if (connectTimeout != -1)
+ m_connection.setConnectTimeout(connectTimeout);
+ if (readTimeout != -1)
+ m_connection.setReadTimeout(readTimeout);
}
setLastModified(m_connection.getLastModified());
m_mimeType = m_connection.getContentType();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]