[ 
https://issues.apache.org/jira/browse/MYFACES-1843?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12582407#action_12582407
 ] 

Leonardo Uribe commented on MYFACES-1843:
-----------------------------------------

Fails on some configurations, due that you don't control how threads are 
assigned

> Configuration cleanup fail on some specific machine configurations
> ------------------------------------------------------------------
>
>                 Key: MYFACES-1843
>                 URL: https://issues.apache.org/jira/browse/MYFACES-1843
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 1.2.2
>         Environment: windows xp, tomcat 6.0.14, fedora linux 5
>            Reporter: Leonardo Uribe
>            Assignee: Leonardo Uribe
>             Fix For: 1.2.3-SNAPSHOT
>
>
> When you load a new application and some time has passed, this message 
> appears on the log:
> SEVERE: Error during configuration clean-upnull
> The error description using e.printStackTrace on 
> org.apache.myfaces.config.FacesConfigurator.update()
> java.lang.reflect.InvocationTargetException
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>     at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>     at java.lang.reflect.Method.invoke(Method.java:597)
>     at 
> org.apache.myfaces.config.FacesConfigurator.purgeConfiguration(FacesConfigurator.java:237)
>     at 
> org.apache.myfaces.config.FacesConfigurator.update(FacesConfigurator.java:214)
>     at 
> org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:72)
>     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:148)
>     at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>     at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>     at 
> org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
>     at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>     at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>     at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>     at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
>     at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>     at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>     at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>     at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
>     at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>     at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
>     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>     at java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.IllegalStateException: The runtime config instance which 
> is created while initialize myfaces must be set through 
> ApplicationImpl.setInitializingRuntimeConfig
>     at 
> org.apache.myfaces.application.ApplicationImpl.internalGetRuntimeConfig(ApplicationImpl.java:134)
>     at 
> org.apache.myfaces.application.ApplicationImpl.<init>(ApplicationImpl.java:127)
>     at 
> org.apache.myfaces.application.ApplicationFactoryImpl.createAndLogNewApplication(ApplicationFactoryImpl.java:48)
>     at 
> org.apache.myfaces.application.ApplicationFactoryImpl.purgeApplication(ApplicationFactoryImpl.java:53)
>     ... 23 more
> Myfaces has a feature controlled by the param 
> org.apache.myfaces.CONFIG_REFRESH_PERIOD, that update the configuration when 
> the refresh period has been reached since las update.
> This problem is caused by the behavior of this variable:
> public class ApplicationImpl extends Application
> {
>     // recives the runtime config instance during initializing
>     private final static ThreadLocal<RuntimeConfig> initializingRuntimeConfig 
> = new ThreadLocal<RuntimeConfig>();
> this is a variable local per thread, but on a web container you don't control 
> what thread are accessing this variable. The result is when he try to refresh 
> the configuration with a different thread, this variable is null, so the call 
> of the constructor ApplicationImpl() fails.
> The solution is instead this:
>     private static RuntimeConfig internalGetRuntimeConfig()
>     {
>         if (initializingRuntimeConfig.get() == null)
>         {
>             throw new IllegalStateException("The runtime config instance 
> which is created while initialize myfaces "
>                     + "must be set through 
> ApplicationImpl.setInitializingRuntimeConfig");
>         }
>         return initializingRuntimeConfig.get();
>     }
> do this:
>     private static RuntimeConfig internalGetRuntimeConfig()
>     {
>         if (initializingRuntimeConfig.get() == null)
>         {
>             //It may happen that the current thread value
>             //for initializingRuntimeConfig is not set 
>             //(note that this value is final, so it just 
>             //allow set only once per thread).
>             //So the better for this case is try to get
>             //the value using RuntimeConfig.getCurrentInstance()
>             //instead throw an IllegalStateException (only fails if
>             //the constructor is called before setInitializingRuntimeConfig).
>             //From other point of view, AbstractFacesInitializer do 
>             //the same as below, so there is not problem if
>             //we do this here and this is the best place to do
>             //this.
>             //log.info("initializingRuntimeConfig.get() == null, so loading 
> from ExternalContext");
>             ApplicationImpl.setInitializingRuntimeConfig(
>                     RuntimeConfig.getCurrentInstance(
>                             FacesContext.getCurrentInstance()
>                             .getExternalContext()));
>             //throw new IllegalStateException("The runtime config instance 
> which is created while initialize myfaces "
>             //        + "must be set through 
> ApplicationImpl.setInitializingRuntimeConfig");
>         }
>         return initializingRuntimeConfig.get();
>     }
> With this code we ensure correct initialization of this value, like in 
> AbstractFacesInitializer

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to