[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