2323
2424import org .jboss .weld .Container ;
2525import org .jboss .weld .bootstrap .api .Service ;
26+ import org .jboss .weld .context .BoundContext ;
27+ import org .jboss .weld .context .ManagedContext ;
2628import org .jboss .weld .context .cache .RequestScopedCache ;
2729import org .jboss .weld .context .http .HttpRequestContext ;
2830import org .jboss .weld .context .http .HttpRequestContextImpl ;
@@ -279,24 +281,21 @@ public void requestDestroyed(HttpServletRequest request) {
279281 if (!servletApi .isAsyncSupported () || !servletApi .isAsyncStarted (request )) {
280282 getRequestContext ().invalidate ();
281283 }
282- getRequestContext ().deactivate ();
284+
285+ safelyDeactivate (getRequestContext (), request );
283286 // fire @Destroyed(RequestScoped.class)
284287 requestDestroyedEvent .fire (request );
285- getSessionContext ().deactivate ();
288+
289+ safelyDeactivate (getSessionContext (), request );
286290 // fire @Destroyed(SessionScoped.class)
287291 if (!getSessionContext ().isValid ()) {
288292 sessionDestroyedEvent .fire ((HttpSession ) request .getAttribute (HTTP_SESSION ));
289293 }
290294 } finally {
291- getRequestContext ().dissociate (request );
292-
295+ safelyDissociate (getRequestContext (), request );
293296 // WFLY-1533 Underlying HTTP session may be invalid
294- try {
295- getSessionContext ().dissociate (request );
296- } catch (Exception e ) {
297- ServletLogger .LOG .unableToDissociateContext (getSessionContext (), request );
298- ServletLogger .LOG .catchingDebug (e );
299- }
297+ safelyDissociate (getSessionContext (), request );
298+
300299 // Catch block is inside the activator method so that we're able to log the context
301300 conversationContextActivator .disassociateConversationContext (request );
302301
@@ -312,6 +311,10 @@ public void setConversationActivationEnabled(boolean conversationActivationEnabl
312311 this .conversationActivationEnabled = conversationActivationEnabled ;
313312 }
314313
314+ @ Override
315+ public void cleanup () {
316+ }
317+
315318 /**
316319 * Some Servlet containers fire HttpServletListeners for include requests (inner requests caused by calling the include method of RequestDispatcher). This
317320 * causes problems with context shut down as context manipulation is not reentrant. This method detects if this request is an included request or not.
@@ -338,7 +341,22 @@ private boolean isRequestDestroyed(HttpServletRequest request) {
338341 return request .getAttribute (REQUEST_DESTROYED ) != null ;
339342 }
340343
341- @ Override
342- public void cleanup () {
344+ private <T > void safelyDissociate (BoundContext <T > context , T storage ) {
345+ try {
346+ context .dissociate (storage );
347+ } catch (Exception e ) {
348+ ServletLogger .LOG .unableToDissociateContext (context , storage );
349+ ServletLogger .LOG .catchingDebug (e );
350+ }
351+ }
352+
353+ private void safelyDeactivate (ManagedContext context , HttpServletRequest request ) {
354+ try {
355+ context .deactivate ();
356+ } catch (Exception e ) {
357+ ServletLogger .LOG .unableToDeactivateContext (context , request );
358+ ServletLogger .LOG .catchingDebug (e );
359+ }
343360 }
361+
344362}
0 commit comments