servlet init hangs reading /WEB-INF/web.xml 5.0.1
mlybarger Mar 9, 2009 7:57 AMI have a very simple servlet which hangs on the servlet init method. Another similar example I have throws an OOM excetpion doing the same thing. All the code is doing is trying to parse the web.xml using the commons digester.
I hope this isn't too much code to paste. I'm running a default 5.0.1 (same behavior on 5.0.0, but this code runs fine on the 4.2.2 server) server with 1.6.0.11 jdk.
This code originates from the struts 1.1 ActionServlet. There is a problem with the digester.parse() call. Does this have something to do with VFS perhaps?
package org.test;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.digester.Digester;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.xml.sax.SAXException;
public class TestServlet extends HttpServlet {
public TestServlet() {
super();
// TODO Auto-generated constructor stub
}
protected static Log log = LogFactory.getLog(TestServlet.class);
protected String registrations[] = {
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",
"/org/apache/struts/resources/struts-config_1_0.dtd",
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN",
"/org/apache/struts/resources/struts-config_1_1.dtd",
"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN",
"/org/apache/struts/resources/web-app_2_2.dtd",
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN",
"/org/apache/struts/resources/web-app_2_3.dtd"
};
protected String servletMapping = null;
protected String servletName = null;
/**
* @see Servlet#init(ServletConfig)
*/
protected void initServlet() throws ServletException
{
// Remember our servlet name
this.servletName = getServletConfig().getServletName();
// Prepare a Digester to scan the web application deployment descriptor
Digester digester = new Digester();
digester.push(this);
digester.setNamespaceAware(true);
digester.setValidating(false);
// Register our local copy of the DTDs that we can find
for (int i = 0; i < registrations.length; i += 2) {
URL url = this.getClass().getResource(registrations[i+1]);
if (url != null) {
digester.register(registrations, url.toString());
}
}
// Configure the processing rules that we need
digester.addCallMethod("web-app/servlet-mapping",
"addServletMapping", 2);
digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);
digester.addCallParam("web-app/servlet-mapping/url-pattern", 1);
// Process the web application deployment descriptor
if (log.isDebugEnabled()) {
log.debug("Scanning web.xml for controller servlet mapping");
}
InputStream input =
getServletContext().getResourceAsStream("/WEB-INF/web.xml");
try {
digester.parse(input);
} catch (IOException e) {
log.error("io error", e);
throw new ServletException(e);
} catch (SAXException e) {
log.error("error", e);
throw new ServletException(e);
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
log.error("error", e);
throw new ServletException(e);
}
}
}
// Record a servlet context attribute (if appropriate)
if (log.isDebugEnabled()) {
log.debug("Mapping for servlet '" + servletName + "' = '" +
servletMapping + "'");
}
if (servletMapping != null) {
getServletContext().setAttribute(Globals.SERVLET_KEY, servletMapping);
}
}
public void init() throws ServletException {
log.info("start - init()");
initServlet();
log.info("done - init()");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>jbtest</display-name> <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class>org.test.TestServlet</servlet-class> <load-on-startup>-1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>/do/eforms-client</url-pattern> </servlet-mapping> </web-app>
It's been over 5 minutes sitting there with the cpu spiked and the init method didn't finish. My log only shows the start log, not the stop.