Hi

2010/9/14 Gurkan Erdogdu <[email protected]>

> Hello,
>
> Currently MyFaces uses "static DEFAULT_LIFECYCLE_PROVIDER" instance in the
> DefaultLifecycleProviderFactory. But, it creates problems in containers,
> such as
> Tomcat. Indeed, it is not possible to use META-INF/services approach
> because of
> using static instance.
>
>
> ---------------------------
> Example scenario,
> ---------------------------
>
> - Firstly deployed and used web application initializes  the static
> "DEFAULT_LIFECYCLE_PROVIDER" as follows:
>
> Lifecycle provider is initially configured in "ManagedBeanDestroyerListener
> #
> requestDestroyed(ServletRequestEvent event)" method using
> "destroyer.getCurrentLifecycleProvider();" method call. In this case
> "externalContext" instance that is passed to the "LifecycleProviderFactory
> #
> getLifecycleProvider(external context is null)" is NULL, therefore
> "DEFAULT_LIFECYCLE_PROVIDER" is initialized using
> "resolveFallbackLifecycleProvider();".
>
>
The latest code on trunk contains a fix, so a FacesContext instance is
provided and that
scenario should never happen.


> After that point it is not possible to use "META-INF/services" approach,
> because
> code has never been reached to the "else" branch of
> "LifecycleProviderFactory #
> getLifecycleProvider(external context is not null)". All other deployed web
> applications have to use this "DEFAULT_LIFECYCLE_PROVIDER". instance.
>
>
Moreover, using singleton is also a problem in a "Hierarchical class loader
> environments", like Tomcat 7. In Tomcat7, resource injections are provided
> by
> "DefaultInstanceManager" instance. Each context has its own instance
> manager.
> Therefore, it is impossible to use single lifecycle provider instance that
> is
> shared by all contexts. For example, I have written Tomcat 7 based
> annotation
> lifecycle provider instance. Becuase of singleton semenatics of
> LifecycleProvider, it is not possible to implement provider.
>
>

Ok, I'll take a look at that one.


> ----------------------------------
> One Possible Solution:
> ---------------------------------
> Lifecycle provider must be created for each "ServletContext". Therefore
> each
> application has its own "Lifecycle Provider" instance. When an application
> is
> initialized, "lifecycle provider instance" will be instantiated and when
> the
> application is destroyed, "lifecycle provider instance" will be released.
>
> - Updating "release" method of LifeCycleFactoryProvider that gets
> ExternalContext. Also, adding map to factory that holds "ServletContext,
> Lifecycleprovider"s.
>
> - Updating StartupServletContextListener # contextInitialized to created
> "LifecycleProvider" and StartupServletContextListener # contextDestoryed to
> release it.
>
>
I think it is not necessary to "release" it, because this one is a stateless
object and
 if it is an object on application scope, it will be discarded there.

best regards,

Leonardo Uribe


> With this approach, it remains one problem. When "requestDestoyed" method
> is
> called, "external context is null" and not find correct "LifecycleProvider"
> instance.
>
> WDYT?
>
> --Gurkan
>
>
>
>

Reply via email to