Author: remy.maucherat(a)jboss.com
Date: 2010-11-25 06:20:52 -0500 (Thu, 25 Nov 2010)
New Revision: 1590
Modified:
trunk/java/org/apache/catalina/core/StandardContextValve.java
trunk/java/org/apache/catalina/core/StandardHostValve.java
trunk/webapps/docs/changelog.xml
Log:
- 49991: Improve timing of request listener calls.
Modified: trunk/java/org/apache/catalina/core/StandardContextValve.java
===================================================================
--- trunk/java/org/apache/catalina/core/StandardContextValve.java 2010-11-25 10:43:58 UTC
(rev 1589)
+++ trunk/java/org/apache/catalina/core/StandardContextValve.java 2010-11-25 11:20:52 UTC
(rev 1590)
@@ -158,59 +158,8 @@
}
}
- // Normal request processing
- Object instances[] = context.getApplicationEventListeners();
-
- ServletRequestEvent event = null;
-
- if ((instances != null)
- && (instances.length > 0)) {
- event = new ServletRequestEvent
- (((StandardContext) container).getServletContext(),
- request.getRequest());
- // create pre-service event
- for (int i = 0; i < instances.length; i++) {
- if (instances[i] == null)
- continue;
- if (!(instances[i] instanceof ServletRequestListener))
- continue;
- ServletRequestListener listener =
- (ServletRequestListener) instances[i];
- try {
- listener.requestInitialized(event);
- } catch (Throwable t) {
-
container.getLogger().error(sm.getString("standardContext.requestListener.requestInit",
- instances[i].getClass().getName()), t);
- ServletRequest sreq = request.getRequest();
- sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
- return;
- }
- }
- }
-
wrapper.getPipeline().getFirst().invoke(request, response);
- if ((instances !=null ) &&
- (instances.length > 0)) {
- // create post-service event
- for (int i = instances.length - 1; i >= 0; i--) {
- if (instances[i] == null)
- continue;
- if (!(instances[i] instanceof ServletRequestListener))
- continue;
- ServletRequestListener listener =
- (ServletRequestListener) instances[i];
- try {
- listener.requestDestroyed(event);
- } catch (Throwable t) {
-
container.getLogger().error(sm.getString("standardContext.requestListener.requestDestroy",
- instances[i].getClass().getName()), t);
- ServletRequest sreq = request.getRequest();
- sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
- }
- }
- }
-
}
@@ -229,56 +178,10 @@
public final void event(Request request, Response response, HttpEvent httpEvent)
throws IOException, ServletException {
- Object instances[] = context.getApplicationEventListeners();
- ServletRequestEvent event = null;
- if (instances != null && (instances.length > 0)) {
- event = new ServletRequestEvent
- (((StandardContext) container).getServletContext(),
- request.getRequest());
- // create pre-service event
- for (int i = 0; i < instances.length; i++) {
- if (instances[i] == null)
- continue;
- if (!(instances[i] instanceof ServletRequestListener))
- continue;
- ServletRequestListener listener =
- (ServletRequestListener) instances[i];
- try {
- listener.requestInitialized(event);
- } catch (Throwable t) {
-
container.getLogger().error(sm.getString("requestListenerValve.requestInit",
- instances[i].getClass().getName()), t);
- ServletRequest sreq = request.getRequest();
- sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
- return;
- }
- }
- }
-
// Select the Wrapper to be used for this Request
Wrapper wrapper = request.getWrapper();
wrapper.getPipeline().getFirst().event(request, response, httpEvent);
- if (instances != null && (instances.length > 0)) {
- // create post-service event
- for (int i = instances.length - 1; i >= 0; i--) {
- if (instances[i] == null)
- continue;
- if (!(instances[i] instanceof ServletRequestListener))
- continue;
- ServletRequestListener listener =
- (ServletRequestListener) instances[i];
- try {
- listener.requestDestroyed(event);
- } catch (Throwable t) {
-
container.getLogger().error(sm.getString("requestListenerValve.requestDestroy",
- instances[i].getClass().getName()), t);
- ServletRequest sreq = request.getRequest();
- sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
- }
- }
- }
-
}
Modified: trunk/java/org/apache/catalina/core/StandardHostValve.java
===================================================================
--- trunk/java/org/apache/catalina/core/StandardHostValve.java 2010-11-25 10:43:58 UTC
(rev 1589)
+++ trunk/java/org/apache/catalina/core/StandardHostValve.java 2010-11-25 11:20:52 UTC
(rev 1590)
@@ -24,6 +24,9 @@
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
@@ -123,6 +126,36 @@
(context.getLoader().getClassLoader());
}
+ // Enter application scope
+ Object instances[] = context.getApplicationEventListeners();
+
+ ServletRequestEvent event = null;
+
+ if ((instances != null)
+ && (instances.length > 0)) {
+ event = new ServletRequestEvent
+ (((StandardContext) container).getServletContext(),
+ request.getRequest());
+ // create pre-service event
+ for (int i = 0; i < instances.length; i++) {
+ if (instances[i] == null)
+ continue;
+ if (!(instances[i] instanceof ServletRequestListener))
+ continue;
+ ServletRequestListener listener =
+ (ServletRequestListener) instances[i];
+ try {
+ listener.requestInitialized(event);
+ } catch (Throwable t) {
+
container.getLogger().error(sm.getString("standardContext.requestListener.requestInit",
+ instances[i].getClass().getName()), t);
+ ServletRequest sreq = request.getRequest();
+ sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
+ return;
+ }
+ }
+ }
+
// Ask this Context to process this request
context.getPipeline().getFirst().invoke(request, response);
@@ -143,6 +176,28 @@
status(request, response);
}
+ // Exit application scope
+ if ((instances !=null ) &&
+ (instances.length > 0)) {
+ // create post-service event
+ for (int i = instances.length - 1; i >= 0; i--) {
+ if (instances[i] == null)
+ continue;
+ if (!(instances[i] instanceof ServletRequestListener))
+ continue;
+ ServletRequestListener listener =
+ (ServletRequestListener) instances[i];
+ try {
+ listener.requestDestroyed(event);
+ } catch (Throwable t2) {
+
container.getLogger().error(sm.getString("standardContext.requestListener.requestDestroy",
+ instances[i].getClass().getName()), t2);
+ ServletRequest sreq = request.getRequest();
+ sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t2);
+ }
+ }
+ }
+
// Restore the context classloader
Thread.currentThread().setContextClassLoader
(StandardHostValve.class.getClassLoader());
@@ -174,6 +229,33 @@
(context.getLoader().getClassLoader());
}
+ // Enter application scope
+ Object instances[] = context.getApplicationEventListeners();
+ ServletRequestEvent event2 = null;
+ if (instances != null && (instances.length > 0)) {
+ event2 = new ServletRequestEvent
+ (((StandardContext) container).getServletContext(),
+ request.getRequest());
+ // create pre-service event
+ for (int i = 0; i < instances.length; i++) {
+ if (instances[i] == null)
+ continue;
+ if (!(instances[i] instanceof ServletRequestListener))
+ continue;
+ ServletRequestListener listener =
+ (ServletRequestListener) instances[i];
+ try {
+ listener.requestInitialized(event2);
+ } catch (Throwable t) {
+
container.getLogger().error(sm.getString("requestListenerValve.requestInit",
+ instances[i].getClass().getName()), t);
+ ServletRequest sreq = request.getRequest();
+ sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
+ return;
+ }
+ }
+ }
+
// Ask this Context to process this request
context.getPipeline().getFirst().event(request, response, event);
@@ -209,6 +291,27 @@
}
}
+ // Exit application scope
+ if (instances != null && (instances.length > 0)) {
+ // create post-service event
+ for (int i = instances.length - 1; i >= 0; i--) {
+ if (instances[i] == null)
+ continue;
+ if (!(instances[i] instanceof ServletRequestListener))
+ continue;
+ ServletRequestListener listener =
+ (ServletRequestListener) instances[i];
+ try {
+ listener.requestDestroyed(event2);
+ } catch (Throwable t) {
+
container.getLogger().error(sm.getString("requestListenerValve.requestDestroy",
+ instances[i].getClass().getName()), t);
+ ServletRequest sreq = request.getRequest();
+ sreq.setAttribute(RequestDispatcher.ERROR_EXCEPTION, t);
+ }
+ }
+ }
+
// Restore the context classloader
Thread.currentThread().setContextClassLoader
(StandardHostValve.class.getClassLoader());
Modified: trunk/webapps/docs/changelog.xml
===================================================================
--- trunk/webapps/docs/changelog.xml 2010-11-25 10:43:58 UTC (rev 1589)
+++ trunk/webapps/docs/changelog.xml 2010-11-25 11:20:52 UTC (rev 1590)
@@ -31,6 +31,10 @@
<fix>
<bug>49779</bug>: Interaction between continue and FORM. (markt)
</fix>
+ <fix>
+ <bug>49991</bug>: Actually call Request listener when entering and
exiting the application scope, not simply just before
+ calling the filter chain. (remm)
+ </fix>
</changelog>
</subsection>
<subsection name="Jasper">