txs, I'll reopen the JIRA again! LieGrue, strub
----- Original Message ---- > From: Gurkan Erdogdu <[email protected]> > To: [email protected] > Sent: Thu, July 1, 2010 1:37:30 PM > Subject: Re: svn commit: r959590 - > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java > > Hello Mark; When the application is removed, you have to remove also from > ContextFactory cache othewise create a > leak --thanks; ________________________________ From: > " > href="mailto:[email protected]">[email protected]" < > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected]> To: > ymailto="mailto:[email protected]" > href="mailto:[email protected]">[email protected] Sent: > Thu, July 1, 2010 1:45:05 PM Subject: svn commit: r959590 - > /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java Author: > struberg Date: Thu Jul 1 10:45:05 2010 New Revision: > 959590 URL: > http://svn.apache.org/viewvc?rev=959590&view=rev Log: OWB-369 improve > ContextsService retrieval Getting the ContextsService each time was very > expensive. We now cache it depending on the ClassLoader. This way it is > possible that different WebApps may configure different > ContextsServices. Modified: > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java Modified: > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java URL: > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java?rev=959590&r1=959589&r2=959590&view=diff ============================================================================== --- > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java > (original) +++ > openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/context/ContextFactory.java > Thu Jul 1 10:45:05 2010 @@ -19,6 +19,7 @@ package > org.apache.webbeans.context; import > java.lang.annotation.Annotation; +import > java.util.concurrent.ConcurrentHashMap; import > javax.enterprise.context.*; import > javax.enterprise.context.spi.Context; @@ -29,6 +30,7 @@ import > org.apache.webbeans.context.type. import > org.apache.webbeans.corespi.ServiceLoader; import > org.apache.webbeans.logger.WebBeansLogger; import > org.apache.webbeans.spi.ContextsService; +import > org.apache.webbeans.util.WebBeansUtil; /** * JSR-299 based > standard context @@ -38,7 +40,17 @@ public final class > ContextFactory { /**Logger instance*/ > private static final WebBeansLogger logger = > WebBeansLogger.getLogger(ContextFactory.class); - > + + /** + * Underlying context service per > ClassLoader + * This distinction is necessary for application > servers + * with multiple WAR deployments having > different + * ContextsServices configured. + > */ + private static ConcurrentHashMap<ClassLoader, > ContextsService> contextServices + > = new ConcurrentHashMap<ClassLoader, > ContextsService>(); + + /** * > Not-instantiate */ @@ -46,12 +58,29 @@ public final > class ContextFactory { throw > new UnsupportedOperationException(); } + + > /** + * @return the ContextService for the current > ClassLoader + */ + private static > ContextsService getContextsService() + { + > ClassLoader cl = WebBeansUtil.getCurrentClassLoader(); + > ContextsService cs = contextServices.get(cl); + > if (cs == null) + > { + cs = > ServiceLoader.getService(ContextsService.class); + > contextServices.put(cl, cs); + > } + + return > cs; + } + > public static void initRequestContext(Object request) > { try > { - ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = > getContextsService(); > contextService.startContext(RequestScoped.class, request); > } catch (Exception e) @@ -72,7 > +101,7 @@ public final class ContextFactory > public static void destroyRequestContext(Object request) > { - ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = getContextsService(); > contextService.endContext(RequestScoped.class, > request); } @@ -80,7 +109,7 @@ public final class > ContextFactory { try > { - > ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = > getContextsService(); > contextService.startContext(SessionScoped.class, session); > } catch (Exception e) @@ -91,7 > +120,7 @@ public final class ContextFactory public static > void destroySessionContext(Object session) { - > ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = getContextsService(); > contextService.endContext(SessionScoped.class, > session); } @@ -104,7 +133,7 @@ public final class > ContextFactory { try > { - > ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = > getContextsService(); > contextService.startContext(ApplicationScoped.class, parameter); > } catch (Exception > e) @@ -121,7 +150,7 @@ public final class ContextFactory > */ public static void destroyApplicationContext(Object > parameter) { - ContextsService > contextService = ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = > getContextsService(); > contextService.endContext(ApplicationScoped.class, parameter); > } @@ -129,7 +158,7 @@ public final class > ContextFactory { try > { - > ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = > getContextsService(); > contextService.startContext(Singleton.class, parameter); > } catch (Exception e) @@ -140,7 > +169,7 @@ public final class ContextFactory > public static void destroySingletonContext(Object parameter) > { - ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = getContextsService(); > contextService.endContext(Singleton.class, parameter); > } @@ -148,7 +177,7 @@ public final class ContextFactory > { try > { - ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = > getContextsService(); > contextService.startContext(ConversationScoped.class, context); > } catch (Exception e) @@ > -159,7 +188,7 @@ public final class ContextFactory public > static void destroyConversationContext() { - > ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = getContextsService(); > contextService.endContext(ConversationScoped.class, > null); } @@ -173,7 +202,7 @@ public final class > ContextFactory public static Context > getStandardContext(ContextTypes type) throws > ContextNotActiveException { > Context context = null; - ContextsService > contextService = ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = > getContextsService(); switch > (type.getCardinal()) { > case 0: @@ -250,7 +279,7 @@ public final class > ContextFactory */ public static void > activateContext(Class<? extends Annotation> scopeType) > { - ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = getContextsService(); > contextService.activateContext(scopeType); > } @@ -259,7 +288,7 @@ public final class > ContextFactory */ public static void > deActivateContext(Class<? extends Annotation> scopeType) > { - ContextsService contextService = > ServiceLoader.getService(ContextsService.class); + > ContextsService contextService = getContextsService(); > contextService.deActivateContext(scopeType); > }
