[gatein-dev] SessionManagerContainer in exo.kernel.container 2.5.0-Alpha3

Lucas Ponce lponce at redhat.com
Fri Nov 29 04:16:02 EST 2013


Hello Nicolas,

This is a summary of code that is creating this issue:

- Implementation of REST service uses:
...
ExoContainer container = ExoContainerContext.getCurrentContainer();
DataStorage dataStorage = (DataStorage) container.getComponentInstanceOfType(DataStorage.class);
dataStorage.load(state, ApplicationType.PORTLET);
...

And load() is failing.

- Debugging stack of calls (summary):

  POMDataStorage.java:
  ...
  load() {
    ...
    pomMgr.execute(load)
    ...
  }
   
  POMSessionManager.java:
  ...
  execute() {
    ...
    getSession(); // This is null and this case is not expected in the logic
    ...
  }  
  getSession() {
    ...
    SessionContext context = configurator.getContext();
    ...
  }  

  MOPChromatticLifeCycle.java:
  ...   
  ThreadLocal<LocalContext> currentContext = ...
  ...
  getContext() {
    ...
    Synchronization sync = manager.getSynchronization();
    LocalContext localContext = currentContext.get()
    ...
  }

  ChromatticManager.java:
  ...
  ThreadLocal<Synchronization> currentSynchronization = ...
  ...
  public Synchronization getSynchronization() {
    return currentSynchronization.get();
  }
  ...

So, POMSessionManager has a null in getSession() invocation and it seems that ChromaticManager is storing context in a different thread.

This is happening since upgraded to Alpha3, so I'm trying to debug what can be the root cause for this behaviour.

Thanks for taking a look into it.

Lucas


----- Mensaje original -----
> De: "Nicolas Filotto" <nicolas.filotto at exoplatform.com>
> Para: "Lucas Ponce" <lponce at redhat.com>
> CC: "gatein-dev" <gatein-dev at lists.jboss.org>
> Enviados: Viernes, 29 de Noviembre 2013 9:15:59
> Asunto: Re: [gatein-dev] SessionManagerContainer in exo.kernel.container 2.5.0-Alpha3
> 
> There are many things that have been added between Alpha1 and Alpha3, so I
> will need more details. What do you mean exactly by "strange behavior with
> some ThreadLocal<> variables"?
> 
> Please note that I don't work on Fridays so I will answer next week once I
> will have more details
> 
> 
> On Thu, Nov 28, 2013 at 8:46 PM, Lucas Ponce <lponce at redhat.com> wrote:
> 
> > Nicolas,
> >
> > Do you know if there is some change related multithreading between kernel
> > 2.5.0-Alpha3 and 2.5.0-Alpha1 ?
> >
> > Debugging a class I'm seeing some strange behaviour with some
> > ThreadLocal<> variables.
> >
> > Thanks again,
> > Lucas
> >
> > ----- Mensaje original -----
> > > De: "Nicolas Filotto" <nicolas.filotto at exoplatform.com>
> > > Para: "Lucas Ponce" <lponce at redhat.com>
> > > CC: "gatein-dev" <gatein-dev at lists.jboss.org>
> > > Enviados: Jueves, 28 de Noviembre 2013 18:08:29
> > > Asunto: Re: [gatein-dev] SessionManagerContainer in exo.kernel.container
> > 2.6.0-Alpha3
> > >
> > > If you use the SessionManagerContainer, why don't you have a compilation
> > > error ?
> > >
> > >
> > > On Thu, Nov 28, 2013 at 4:50 PM, Lucas Ponce <lponce at redhat.com> wrote:
> > >
> > > > Hello Nicolas,
> > > >
> > > > POMSessionManager.java needs to access to SessionContext at this point:
> > > >
> > > >     public POMSession getSession() {
> > > >         SessionContext context = configurator.getContext();
> > > >         return context != null ? (POMSession)
> > > > context.getAttachment("mopsession") : null;
> > > >     }
> > > >
> > > > This is needed to PortalNamesCache.java to perform a query to
> > > > POMDataStorage component:
> > > >
> > > >     @Override
> > > >     public <V> V execute(POMSession session, POMTask<V> task) throws
> > > > Exception {
> > > >         if (!session.isModified()) {
> > > >             if (task instanceof SearchTask.FindSiteKey) {
> > > >                 SearchTask.FindSiteKey find = (SearchTask.FindSiteKey)
> > > > task;
> > > >                 List<PortalKey> data = (List<PortalKey>)
> > > > session.getFromCache(find.getKey());
> > > >                 if (data == null) {
> > > >                     V result = super.execute(session, task);
> > > >                     LazyPageList<PortalKey> list =
> > > > (LazyPageList<PortalKey>) result;
> > > >                     session.putInCache(find.getKey(),
> > > > Collections.unmodifiableList(new ArrayList<PortalKey>(list.getAll())));
> > > >                     return result;
> > > >                 } else {
> > > >                     return (V) new LazyPageList<PortalKey>(new
> > > > ListAccessImpl<PortalKey>(PortalKey.class, data), 10);
> > > >                 }
> > > >             } else if (task instanceof PortalConfigTask.Save || task
> > > > instanceof PortalConfigTask.Remove) {
> > > >                 V result = super.execute(session, task);
> > > >
> > > > session.scheduleForEviction(SearchTask.FindSiteKey.PORTAL_KEY);
> > > >
> > > > session.scheduleForEviction(SearchTask.FindSiteKey.GROUP_KEY);
> > > >                 return result;
> > > >             }
> > > >         }
> > > >
> > > >         //
> > > >         return super.execute(session, task);
> > > >     }
> > > >
> > > > With the current change of version in exo.core, the getSession() in
> > > > POMSessionManager is always null, so a NPE is thrown breaking the POM
> > > > service.
> > > >
> > > > I wonder how I can integrate these new changes to have same behaviour
> > that
> > > > previous version.
> > > >
> > > > Thanks,
> > > > Lucas
> > > >
> > > >
> > > > ----- Mensaje original -----
> > > > > De: "Nicolas Filotto" <nicolas.filotto at exoplatform.com>
> > > > > Para: "Lucas Ponce" <lponce at redhat.com>
> > > > > CC: "gatein-dev" <gatein-dev at lists.jboss.org>
> > > > > Enviados: Jueves, 28 de Noviembre 2013 17:29:27
> > > > > Asunto: Re: [gatein-dev] SessionManagerContainer in
> > exo.kernel.container
> > > > 2.6.0-Alpha3
> > > > >
> > > > > What is the need exactly ? Beeing able to scope a component to a
> > Session?
> > > > > If so it is now possible to define a scope to a component thanks to
> > > > > https://jira.exoplatform.org/browse/KER-258. Out of the box, the
> > kernel
> > > > > supports the scope Singleton, ApplicationScoped and Dependent. By
> > adding
> > > > > some configuration you can extend the list to SessionScoped and
> > > > > RequestScoped. Here is the configuration to add if you want both:
> > > > >
> > > > > <component>
> > > > > <key>org.exoplatform.container.context.ContextManager</key>
> > > > >  <type>org.exoplatform.container.context.ContextManagerImpl</type>
> > > > > <component-plugins>
> > > > > <component-plugin>
> > > > >  <name>main-scopes</name>
> > > > > <set-method>addContexts</set-method>
> > > > > <type>org.exoplatform.container.context.ContextPlugin</type>
> > > > >  <init-params>
> > > > > <object-param>
> > > > > <name>request-scope</name>
> > > > >  <object type="org.exoplatform.container.context.RequestContext"/>
> > > > > </object-param>
> > > > >  <object-param>
> > > > > <name>session-scope</name>
> > > > > <object type="org.exoplatform.container.context.SessionContext"/>
> > > > >  </object-param>
> > > > > </init-params>
> > > > > </component-plugin>
> > > > >  </component-plugins>
> > > > > </component>
> > > > >
> > > > > Please note that the components that you want to scope to
> > SessionScoped
> > > > or
> > > > > RequestScoped must be proxyable as they are normal scopes (which
> > means
> > > > that
> > > > > you will access to the methods through a proxy and you must not
> > access to
> > > > > the fields directly), moreover components that you want to scope to
> > > > > SessionScoped must be Serializable as SessionScoped is a passivating
> > > > scope.
> > > > >
> > > > > Please also note that thanks to KER-252 you can use the annotations
> > > > defined
> > > > > in JSR 330 such as Inject
> > > > >
> > > > >
> > > > > On Thu, Nov 28, 2013 at 3:36 PM, Lucas Ponce <lponce at redhat.com>
> > wrote:
> > > > >
> > > > > > Hello,
> > > > > >
> > > > > > There is a issue in current master that is impacting to REST
> > management
> > > > > > services in GateIn.
> > > > > >
> > > > > > https://issues.jboss.org/browse/GTNPORTAL-3308
> > > > > >
> > > > > > Investigating it looks like that issue appears since migration to
> > > > > > 2.6.0-Alpha3 core.
> > > > > >
> > > > > > Main symptom is a NPE in POMSessionManager class:
> > > > > >
> > > > > >
> > > > > >
> > > >
> > https://github.com/gatein/gatein-portal/blob/428874e25ee9e6dada3fd1a54a4aa9f02f42d641/component/portal/src/main/java/org/exoplatform/portal/pom/config/POMSessionManager.java#L224-L229
> > > > > >
> > > > > > One of the changes of 2.6.0-Alpha3 is to drop the
> > > > SessionManagerContainer
> > > > > > interface from PortalContainer.
> > > > > >
> > > > > > Is there a workaround to access to same functionality in order to
> > fix
> > > > this
> > > > > > issue ?
> > > > > >
> > > > > > Thanks in advance,
> > > > > > Lucas
> > > > > > _______________________________________________
> > > > > > gatein-dev mailing list
> > > > > > gatein-dev at lists.jboss.org
> > > > > > https://lists.jboss.org/mailman/listinfo/gatein-dev
> > > > > >
> > > > >
> > > >
> > >
> >
> 


More information about the gatein-dev mailing list