[jboss-jira] [JBoss JIRA] (AS7-4722) META-INF/resources not available until after Servlet initialization is complete
Eric Sirianni (JIRA)
jira-events at lists.jboss.org
Mon May 7 12:02:17 EDT 2012
Eric Sirianni created AS7-4722:
----------------------------------
Summary: META-INF/resources not available until after Servlet initialization is complete
Key: AS7-4722
URL: https://issues.jboss.org/browse/AS7-4722
Project: Application Server 7
Issue Type: Bug
Components: Web
Affects Versions: 7.1.1.Final
Environment: Generic
Reporter: Eric Sirianni
Assignee: Remy Maucherat
Using the new modular webapps facility in Servlet 3.0, I have a WAR that includes a component JAR with a servlet definition:
{code:title=HelloServlet.java}
@WebServlet(value = "/HelloWorld", loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
InputStream stream = getServletContext().getResourceAsStream("/foo.txt");
System.err.println("foo.txt stream: " + stream);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getOutputStream().print("<h1>Hello World!</h1>");
}
}
{code}
The JAR also packages a resource inside META-INF/resources (as defined in section 4.6 of the Servlet 3.0 spec)
{noformat}
$ jar -tf hello.jar
com/eric/HelloServlet.class
META-INF/resources/foo.txt
{noformat}
That JAR is incorporated into a WAR, which is then deployed in AS7:
{noformat}
$ jar -tf standalone/deployments/hello.war
WEB-INF/lib/hello.jar
{noformat}
The issue is with the ordering in which AS7 processes "overlays" (specifically in org.apache.catalina.core.StandardContext.start()). The "overlay" is what makes the META-INF resource available to the ServletContext. The overlays are added *after* the servlets are initialized (via a listener to the COMPLETE_CONFIG_EVENT):
{code:title=StandardContext.java}
// Load and initialize all "load on startup" servlets
if (ok) {
loadOnStartup(findChildren());
}
if (ok) {
if (!listenerStart()) {
log.error( "Error listenerStart");
ok = false;
}
}
if (ok) {
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(COMPLETE_CONFIG_EVENT, null);
}
{code}
Given this, the following behavior is observed:
*With loadOnStartup=-1* the stream for foo.txt is available
{noformat}
11:44:52,708 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015876: Starting deployment of "hello.war"
11:44:53,464 INFO [org.jboss.web] (MSC service thread 1-3) JBAS018210: Registering web context: /hello
11:44:53,481 INFO [org.jboss.as] (MSC service thread 1-3) JBAS015951: Admin console listening on http://127.0.0.1:9990
11:44:53,496 INFO [org.jboss.as] (MSC service thread 1-3) JBAS015874: JBoss AS 7.1.1.Final "Brontes" started in 4611ms - Started 173 of 250 services (76 services are passive or on-demand)
11:44:53,588 INFO [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "hello.war"
11:45:21,460 ERROR [stderr] (http--127.0.0.1-8080-1) foo.txt stream: java.io.ByteArrayInputStream at 13f0c45f
{noformat}
*With loadOnStartup=1* the stream for foo.txt is null
{noformat}
11:43:53,224 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015876: Starting deployment of "hello.war"
11:43:54,152 ERROR [stderr] (MSC service thread 1-3) foo.txt stream: null
11:43:54,174 INFO [org.jboss.web] (MSC service thread 1-3) JBAS018210: Registering web context: /hello
11:43:54,189 INFO [org.jboss.as] (MSC service thread 1-4) JBAS015951: Admin console listening on http://127.0.0.1:9990
{noformat}
The expected behavior is that resources from overlays be made available prior to servlet initialization for loadOnStartup servlets.
This is, of course, a toy example, but this presents serious issues when modularizing a large scale web application.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list