From d0cca9c018b312e85b6d849eae0a0c6f1eb59ed7 Mon Sep 17 00:00:00 2001 From: jfarcand Date: Thu, 2 Feb 2012 10:26:52 -0500 Subject: [PATCH] More fix for #170 [long-polling] Message losts during concurrent suspend/broadcast --- .../atmosphere/cpr/DefaultBroadcaster.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/cpr/src/main/java/org/atmosphere/cpr/DefaultBroadcaster.java b/modules/cpr/src/main/java/org/atmosphere/cpr/DefaultBroadcaster.java index 9d1ba4374f9..5e312e28c73 100644 --- a/modules/cpr/src/main/java/org/atmosphere/cpr/DefaultBroadcaster.java +++ b/modules/cpr/src/main/java/org/atmosphere/cpr/DefaultBroadcaster.java @@ -641,27 +641,28 @@ protected Object perRequestFilter(AtmosphereResource r, Entry msg) { Object finalMsg = msg.message; if (AtmosphereResourceImpl.class.isAssignableFrom(r.getClass())) { - if (AtmosphereResourceImpl.class.cast(r).isInScope()) { - if (r.getRequest() instanceof HttpServletRequest && bc.hasPerRequestFilters()) { - Object message = msg.originalMessage; - BroadcastAction a = bc.filter((HttpServletRequest) r.getRequest(), (HttpServletResponse) r.getResponse(), message); - if (a.action() == BroadcastAction.ACTION.ABORT) { - return null; - } - if (a.message() != msg.originalMessage) { - finalMsg = a.message(); + synchronized(r) { + if (AtmosphereResourceImpl.class.cast(r).isInScope()) { + if (r.getRequest() instanceof HttpServletRequest && bc.hasPerRequestFilters()) { + Object message = msg.originalMessage; + BroadcastAction a = bc.filter((HttpServletRequest) r.getRequest(), (HttpServletResponse) r.getResponse(), message); + if (a.action() == BroadcastAction.ACTION.ABORT) { + return null; + } + if (a.message() != msg.originalMessage) { + finalMsg = a.message(); + } } + } else { + // The resource is no longer valid. + removeAtmosphereResource(r); + BroadcasterFactory.getDefault().removeAllAtmosphereResource(r); } if (cacheStrategy == BroadcasterCache.STRATEGY.AFTER_FILTER) { trackBroadcastMessage(r, finalMsg); } - } else { - // The resource is no longer valid. - removeAtmosphereResource(r); - BroadcasterFactory.getDefault().removeAllAtmosphereResource(r); } - } return finalMsg; }