Thanks Romain!

I'm trying to interpret it.
There is no portable way to destroy a custom CDI context on session
expiration. It's implementation specific whether CDI is up while session
expires upon undeploy.
- even session expiration upon node shutdown is implementation, and
configuration specific in a distributed environment. Tomcat for example
expires sessions locally on node, did not check others  -

Best I can do:
- introduce a flag ( for example a system property )
- observe @BeforeShutdown
- from observer iterate through all active contexts, and destroy them. Or
just skip it according to the flag.

Am I understand it right?


2017-02-26 13:24 GMT+01:00 Romain Manni-Bucau <rmannibu...@gmail.com>:

> Yes, depends the session manager impl there. It has several pitfalls like
> breaking distribution etc so best is to remove it likely through a flag and
> observe shutdown event for the final destruction if needed.
>
>
> Le 26 févr. 2017 12:48, "Tamás Kimmel" <kumm0...@gmail.com> a écrit :
>
> > Hi, I'm implementing a custom CDI context storing itself in session.
> > On session expiration my context should destroy all active contextual
> > instances.
> >
> > I've run into an issue after turned off session serialization.
> > ( with a context.xml contains <Manager pathname="" />)
> >
> > Upon undeploy tomcat expires all sessions ( as it should ), but I get an
> > exception.
> > beanManager.getPassivationCapableBean can't find my bean, and it causes
> an
> > NPE in deltaspike AbstractContext.destroyBean.
> > It seems to me application beans are undeployed already when session
> > expiration event fired. I've found even my context is lost at this point,
> > beanManager.getContext() fails.
> >
> > An example project can be found here: https://github.com/kumm/
> mycdicontext
> > 'mvn test' is green but predestroy don't run ('++ HelloBean preDestroy
> ++'
> > should appear in the log), and exception is logged.
> >
> > Running with -Pwildfly, or -Pglassfish it's working.
> > Maybe it's something implementation specific and my approach is wrong?
> >
> > Thanks in advance,
> > Kimmel Tamás
> >
> > Stacktrace below:
> >
> > 26-Feb-2017 12:03:28.209 INFO [http-nio-8080-exec-6]
> > org.apache.openejb.assembler.classic.Assembler.destroyApplication
> > Undeploying app:
> > /home/kumm/Workspace/Projects/tomeecditest/target/tomee/wd/
> > 0/eb577be1-a135-4f7d-bd6e-01ea88695d21
> > 26-Feb-2017 12:03:28.216 SEVERE [http-nio-8080-exec-6]
> > org.apache.webbeans.component.AbstractOwbBean.destroy Exception thrown
> > while destroying bean instance : [StorageRepository,
> WebBeansType:MANAGED,
> > Name:null, API
> > Types:[java.lang.Object,java.io.Serializable,trial.mycontext.MyContext$
> > StorageRepository],
> > Qualifiers:[javax.enterprise.inject.Default,javax.
> enterprise.inject.Any]]
> >  java.lang.NullPointerException
> >     at
> > org.apache.deltaspike.core.util.context.AbstractContext.
> > destroyBean(AbstractContext.java:202)
> >     at
> > org.apache.deltaspike.core.util.context.AbstractContext.
> destroyAllActive(
> > AbstractContext.java:195)
> >     at
> > trial.mycontext.MyContext$StorageRepository.destroy(MyContext.java:60)
> >     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >     at
> > sun.reflect.NativeMethodAccessorImpl.invoke(
> NativeMethodAccessorImpl.java:
> > 62)
> >     at
> > sun.reflect.DelegatingMethodAccessorImpl.invoke(
> > DelegatingMethodAccessorImpl.java:43)
> >     at java.lang.reflect.Method.invoke(Method.java:497)
> >     at
> > org.apache.webbeans.intercept.LifecycleInterceptorInvocation
> > Context.proceed(LifecycleInterceptorInvocationContext.java:103)
> >     at
> > org.apache.webbeans.portable.InjectionTargetImpl.preDestroy(
> > InjectionTargetImpl.java:352)
> >     at
> > org.apache.webbeans.component.AbstractOwbBean.destroy(
> > AbstractOwbBean.java:179)
> >     at
> > org.apache.webbeans.context.AbstractContext.destroyInstance(
> > AbstractContext.java:206)
> >     at
> > org.apache.webbeans.context.AbstractContext.destroyInstance(
> > AbstractContext.java:192)
> >     at
> > org.apache.webbeans.context.AbstractContext.destroy(
> > AbstractContext.java:218)
> >     at
> > org.apache.webbeans.web.context.WebContextsService.
> destroySessionContext(
> > WebContextsService.java:547)
> >     at
> > org.apache.webbeans.web.context.WebContextsService.
> > endContext(WebContextsService.java:227)
> >     at
> > org.apache.openejb.server.httpd.BeginWebBeansListener.sessionDestroyed(
> > BeginWebBeansListener.java:170)
> >     at
> > org.apache.catalina.session.StandardSession.expire(
> > StandardSession.java:824)
> >     at
> > org.apache.catalina.session.StandardSession.expire(
> > StandardSession.java:766)
> >     at
> > org.apache.catalina.session.StandardManager.stopInternal(
> > StandardManager.java:396)
> >     at org.apache.catalina.util.LifecycleBase.stop(
> LifecycleBase.java:226)
> >     at
> > org.apache.catalina.core.StandardContext.stopInternal(
> > StandardContext.java:5407)
> >     at org.apache.catalina.util.LifecycleBase.stop(
> LifecycleBase.java:226)
> >     at
> > org.apache.catalina.core.ContainerBase.removeChild(
> ContainerBase.java:815)
> >
>

Reply via email to