Please attach a small web application code that shows your issue. Without
it, it is very hard to visualize your siutation.

As a side note, serialization issues always a problem in Java Web
Applications. You have to manage this via synchoronization blocks or third
party other libs, for example Spring serializes framerwork etc.

For us, creationalContext is created by any proxy instance and saved in the
context until context is destroyed. I really do not understand how you get
instance from other sessions, but it may that you have a problem with your
code. And our code is written as a thread-safe.

So, please attach a small web app that shows the problem therefore we can
solve more rational than intuitively.

Thanks;

--Gurkan

2010/4/13 Mark Struberg <strub...@yahoo.de>

> This makes no difference, really.
> The problem is that we store a CreationalContext as a member in
> NormalScopedBeanInterceptorHandler. And subsequent function calls rely on
> it. But if in the meantime _another_ thread overwrites this
> NormalScopedBeanInterceptorHandler.creationalContext (by using the same
> proxy instance), then we get into troubles.
>
> Tbis is hard to debug and write tests for, but this is really obvious from
> looking at the code. And I already had this problem in my apps. It's not
> funny to randomly pickup instances from other sessions...
>
> LieGrue,
> strub
>
> --- Gurkan Erdogdu <cgurkanerdo...@gmail.com> schrieb am Mo, 12.4.2010:
>
> > Von: Gurkan Erdogdu <cgurkanerdo...@gmail.com>
> > Betreff: Re: svn commit: r933348 - in
> /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept:
> ApplicationScopedBeanIntereptorHandler.java
> DependentScopedBeanInterceptorHandler.java  InterceptorHandler.java
> NormalScopedBeanInterceptorHand
> > An: dev@openwebbeans.apache.org
> > Datum: Montag, 12. April, 2010 22:29 Uhr
> > Please look at AbstractContext,
> > creationalContextMap#putIfAbsent call
> >
> > 2010/4/12 Mark Struberg <strub...@yahoo.de>
> >
> > > Sorry, I think we need to rollback the rollback, since
> > this re-introduces
> > > really heavy concurrency problems.
> > >
> > > @SessionScoped public class User [
> > >  public String getEmail()..
> > > }
> > >
> > > @ApplicationScoped class MailService {
> > >  private @Inject User usr;
> > >
> > >  public void sendMail(String content) {
> > >    sendInternal(user.getEmail(), content);
> > >  }
> > > }
> > >
> > > now, with this change whenever 2 threads (from 2
> > sessions of a webserver)
> > > invoke sendMail and hit the user.getEmail() the
> > > NormalScopedBeanInterceptorHandler gets called and
> > those 2 threads override
> > > each other the
> > > private transient
> > WeakReference<CreationalContext<?>>
> > creationalContext =
> > > null;
> > > because there is only one single proxy instance being
> > used by those 2
> > > threads.
> > >
> > > Got me?
> > >
> > > LieGrue,
> > > strub
> > >
> > > --- gerdo...@apache.org
> > <gerdo...@apache.org>
> > schrieb am Mo, 12.4.2010:
> > >
> > > > Von: gerdo...@apache.org
> > <gerdo...@apache.org>
> > > > Betreff: svn commit: r933348 - in
> > >
> >
> /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept:
> > > ApplicationScopedBeanIntereptorHandler.java
> > > DependentScopedBeanInterceptorHandler.java
> > InterceptorHandler.java
> > > NormalScopedBeanInterceptorHandler.java
> > > > An: comm...@openwebbeans.apache.org
> > > > Datum: Montag, 12. April, 2010 20:20 Uhr
> > > > Author: gerdogdu
> > > > Date: Mon Apr 12 18:20:06 2010
> > > > New Revision: 933348
> > > >
> > > > URL: http://svn.apache.org/viewvc?rev=933348&view=rev
> > > > Log:
> > > > [OWB-351] OWB picks up @SessionScoped contextual
> > instances
> > > > from expired sessions. Corrects eating client
> > provided
> > > > creational context via BeanManager#getReference
> > > >
> > > > Modified:
> > > >
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> > > >
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> > > >
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> > > >
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> > > >
> > > > Modified:
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> > > > URL:
> > >
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> > > >
> > >
> >
> ==============================================================================
> > > > ---
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> > > > (original)
> > > > +++
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/ApplicationScopedBeanIntereptorHandler.java
> > > > Mon Apr 12 18:20:06 2010
> > > > @@ -21,7 +21,6 @@ package
> > org.apache.webbeans.intercept;
> > > >  import
> > javax.enterprise.context.spi.CreationalContext;
> > > >
> > > >  import
> > org.apache.webbeans.component.OwbBean;
> > > > -import
> > > >
> > org.apache.webbeans.context.creational.CreationalContextImpl;
> > > >
> > > >
> > > >  /**
> > > > @@ -43,7 +42,7 @@ public class
> > ApplicationScopedBeanIntere
> > > >      /**
> > > >       * Creates a new
> > handler.
> > > >       * @param bean
> > bean
> > > > -     * @param
> > creationalContext
> > > > creational context
> > > > +     * @param
> > creationalContext
> > > > creaitonal context
> > > >       */
> > > >      public
> > > >
> > ApplicationScopedBeanIntereptorHandler(OwbBean<?>
> > > > bean, CreationalContext<?>
> > creationalContext)
> > > >      {
> > > > @@ -53,11 +52,11 @@ public class
> > > > ApplicationScopedBeanIntere
> > > >      /**
> > > >       * {...@inheritdoc}
> > > >       */
> > > > -    protected Object
> > > > getContextualInstance(OwbBean<Object>
> > bean,
> > > > CreationalContextImpl<?>
> > creationalContext)
> > > > +    protected Object
> > > > getContextualInstance(OwbBean<Object>
> > bean)
> > > >      {
> > > >          if
> > (cachedInstance
> > > > == null)
> > > >          {
> > > > -
> > cachedInstance =
> > > > super.getContextualInstance(bean,
> > creationalContext);
> > > > +
> > cachedInstance =
> > > > super.getContextualInstance(bean);
> > > >          }
> > > >
> > > >          return
> > > > cachedInstance;
> > > >
> > > > Modified:
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> > > > URL:
> > >
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> > > >
> > >
> >
> ==============================================================================
> > > > ---
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> > > > (original)
> > > > +++
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DependentScopedBeanInterceptorHandler.java
> > > > Mon Apr 12 18:20:06 2010
> > > > @@ -67,12 +67,10 @@ public class
> > > > DependentScopedBeanIntercep
> > > >      /**
> > > >       * {...@inheritdoc}
> > > >       */
> > > > -    protected Object
> > callAroundInvokes(Method
> > > > proceed, Object[] arguments,
> > List<InterceptorData>
> > > > stack,
> > > > -
> > > >
> > > >
> > > >    CreationalContextImpl<?> cc)
> > > > -    throws Exception
> > > > +    protected Object
> > callAroundInvokes(Method
> > > > proceed, Object[] arguments,
> > List<InterceptorData>
> > > > stack) throws Exception
> > > >      {
> > > >
> > > >    InvocationContextImpl impl = new
> > > > InvocationContextImpl(this.bean,
> > this.actualInstance
> > > > ,proceed, arguments, stack,
> > InterceptorType.AROUND_INVOKE);
> > > > -
> > > > impl.setCreationalContext(cc);
> > > > +
> > > > impl.setCreationalContext(creationalContext);
> > > >
> > > >          return
> > > > impl.proceed();
> > > >      }
> > > >
> > > > Modified:
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> > > > URL:
> > >
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> > > >
> > >
> >
> ==============================================================================
> > > > ---
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> > > > (original)
> > > > +++
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
> > > > Mon Apr 12 18:20:06 2010
> > > > @@ -169,13 +169,11 @@ public abstract class
> > > > InterceptorHandler
> > > >       * @param method
> > business method
> > > >       * @param proceed
> > proceed method
> > > >       * @param arguments
> > method arguments
> > > > -     * @param
> > creationalContext bean
> > > > creational context
> > > > +     * @param
> > ownerCreationalContext
> > > > bean creational context
> > > >       * @return method
> > result
> > > >       * @throws
> > Exception for exception
> > > >       */
> > > > -    public Object invoke(Object
> > instance, Method
> > > > method, Method proceed, Object[] arguments,
> > > > -
> > > >
> > > >    CreationalContextImpl<?>
> > > > creationalContext)
> > > > -    throws Exception
> > > > +    public Object invoke(Object
> > instance, Method
> > > > method, Method proceed, Object[] arguments,
> > > > CreationalContextImpl<?>
> > ownerCreationalContext)
> > > > throws Exception
> > > >      {
> > > >          //Result of
> > > > invocation
> > > >          Object result
> > =
> > > > null;
> > > > @@ -212,7 +210,7 @@ public abstract class
> > > > InterceptorHandler
> > > >
> > > >
> > > >
> > ((ProxyObject)delegate).setHandler(this.delegateHandler);
> > > >
> > > >
> > > >          // Gets
> > component
> > > > decorator stack
> > > > -
> > > >         decorators
> > =
> > > >
> > WebBeansDecoratorConfig.getDecoratorStack(injectionTarget,
> > > > instance, delegate, creationalContext);
> > > >
> > > >
> > > > +
> > > >         decorators
> > =
> > > >
> > WebBeansDecoratorConfig.getDecoratorStack(injectionTarget,
> > > > instance, delegate, ownerCreationalContext);
> > > >
> > > >
> > > >
> > > >          //Sets
> > decorator
> > > > stack of delegate
> > > >
> > > >
> > > >
> > this.delegateHandler.setDecorators(decorators);
> > > >
> > > >
> > > > @@ -249,10 +247,7 @@ public abstract class
> > > > InterceptorHandler
> > > >
> > > >          // Call Around
> > > > Invokes
> > > >
> > > >          if
> > > >
> > >
> >
> (WebBeansUtil.isContainsInterceptorMethod(this.interceptedMethodMap.get(method),
> > > > InterceptorType.AROUND_INVOKE))
> > > >
> > > >          {
> > > > -
> > > >
> >    return
> > > > callAroundInvokes(method, arguments,
> > > > -
> > > >
> > > >
> > > >
> > > >
> > >
> >
> InterceptorUtil.getInterceptorMethods(this.interceptedMethodMap.get(method),
> > > > -
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > InterceptorType.AROUND_INVOKE),
> > > > -
> > > >
> > > >
> > > >     creationalContext);
> > > > +
> > > >
> >    return
> > > > callAroundInvokes(method, arguments,
> > > >
> > >
> >
> InterceptorUtil.getInterceptorMethods(this.interceptedMethodMap.get(method),
> > > > InterceptorType.AROUND_INVOKE));
> > > >
> > > >          }
> > > >
> > > >
> > > >
> > > >      }
> > > > @@ -307,9 +302,7 @@ public abstract class
> > > > InterceptorHandler
> > > >       * @return return
> > of method
> > > >       * @throws
> > Exception for any exception
> > > >       */
> > > > -    protected abstract Object
> > > > callAroundInvokes(Method interceptedMethod,
> > Object[]
> > > > arguments,
> > > > -
> > > >
> > > >
> > > > List<InterceptorData> stack,
> > > > CreationalContextImpl<?>
> > creationalContext)
> > > > -    throws Exception;
> > > > +    protected abstract Object
> > > > callAroundInvokes(Method interceptedMethod,
> > Object[]
> > > > arguments, List<InterceptorData> stack)
> > throws
> > > > Exception;
> > > >
> > > >      /**
> > > >       *
> > > >
> > > > Modified:
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> > > > URL:
> > >
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java?rev=933348&r1=933347&r2=933348&view=diff
> > > >
> > >
> >
> ==============================================================================
> > > > ---
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> > > > (original)
> > > > +++
> > > >
> > >
> >
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
> > > > Mon Apr 12 18:20:06 2010
> > > > @@ -18,6 +18,7 @@
> > > >   */
> > > >  package org.apache.webbeans.intercept;
> > > >
> > > > +import java.lang.ref.WeakReference;
> > > >  import java.lang.reflect.Method;
> > > >  import java.util.List;
> > > >
> > > > @@ -42,6 +43,9 @@ public class
> > NormalScopedBeanInterceptor
> > > >      /**Serial id*/
> > > >      private static final long
> > > > serialVersionUID = 1L;
> > > >
> > > > +    /**Creational context*/
> > > > +    private transient
> > > > WeakReference<CreationalContext<?>>
> > > > creationalContext = null;
> > > > +
> > > >      /**
> > > >       * Creates a new
> > bean instance
> > > >       * @param bean
> > bean
> > > > @@ -50,6 +54,7 @@ public class
> > NormalScopedBeanInterceptor
> > > >      public
> > > >
> > NormalScopedBeanInterceptorHandler(OwbBean<?> bean,
> > > > CreationalContext<?> creationalContext)
> > > >      {
> > > >          super(bean);
> > > > +
> > this.creationalContext = new
> > > >
> > WeakReference<CreationalContext<?>>(creationalContext);
> > > >      }
> > > >
> > > >      /**
> > > > @@ -58,38 +63,21 @@ public class
> > > > NormalScopedBeanInterceptor
> > > >      @Override
> > > >      public Object invoke(Object
> > > > instance, Method method, Method proceed, Object[]
> > arguments)
> > > > throws Exception
> > > >      {
> > > > -
> > CreationalContextImpl<?>
> > > > creationalContext = null;
> > > > -
> > > > -        //Context of the
> > bean
> > > > -        Context
> > webbeansContext =
> > > > getBeanManager().getContext(bean.getScope());
> > > > -
> > > > -        if (webbeansContext
> > instanceof
> > > > AbstractContext)
> > > > -        {
> > > > -
> > > > creationalContext =
> > (CreationalContextImpl<?>)
> > > >
> > ((AbstractContext)webbeansContext).getCreationalContext(bean);
> > > > -        }
> > > > -        if
> > (creationalContext ==
> > > > null)
> > > > -        {
> > > > -            // if
> > there was
> > > > no CreationalContext set from external, we create
> > a new one
> > > > -
> > > > creationalContext =
> > (CreationalContextImpl<?>)
> > > >
> > CreationalContextFactory.getInstance().getCreationalContext(bean);
> > > > -        }
> > > > -
> > > >          //Get instance
> > from
> > > > context
> > > > -        Object
> > webbeansInstance =
> > > > getContextualInstance((OwbBean<Object>)
> > this.bean,
> > > > creationalContext);
> > > > +        Object
> > webbeansInstance =
> > > > getContextualInstance((OwbBean<Object>)
> > this.bean);
> > > >
> > > >          //Call super
> > > > -        return
> > > > super.invoke(webbeansInstance, method, proceed,
> > arguments,
> > > > creationalContext);
> > > > +        return
> > > > super.invoke(webbeansInstance, method, proceed,
> > arguments,
> > > > (CreationalContextImpl<?>)
> > > > this.creationalContext.get());
> > > >      }
> > > >
> > > >      /**
> > > >       * {...@inheritdoc}
> > > >       */
> > > > -    protected Object
> > callAroundInvokes(Method
> > > > proceed, Object[] arguments,
> > List<InterceptorData>
> > > > stack, CreationalContextImpl<?>
> > creationalContext)
> > > > -    throws Exception
> > > > +    protected Object
> > callAroundInvokes(Method
> > > > proceed, Object[] arguments,
> > List<InterceptorData>
> > > > stack) throws Exception
> > > >      {
> > > > -
> > InvocationContextImpl impl =
> > > > new InvocationContextImpl(this.bean,
> > > > -
> > > >
> > > >
> > > >
> > > >
> > getContextualInstance((OwbBean<Object>)
> > > > this.bean, creationalContext),
> > > > +
> > InvocationContextImpl impl =
> > > > new InvocationContextImpl(this.bean,
> > > > getContextualInstance((OwbBean<Object>)
> > this.bean),
> > > >
> > > >
> > > >
> > > >
> > > > proceed, arguments, stack,
> > InterceptorType.AROUND_INVOKE);
> > > > -
> > > > impl.setCreationalContext(creationalContext);
> > > > +
> > > >
> > impl.setCreationalContext(creationalContext.get());
> > > >
> > > >          return
> > > > impl.proceed();
> > > >
> > > > @@ -99,10 +87,9 @@ public class
> > > > NormalScopedBeanInterceptor
> > > >      /**
> > > >       * Gets instance
> > from context.
> > > >       * @param bean bean
> > instance
> > > > -     * @param
> > creationalContext
> > > >       * @return the
> > underlying contextual
> > > > instance, either cached or resolved from the
> > context
> > > >       */
> > > > -    protected Object
> > > > getContextualInstance(OwbBean<Object>
> > bean,
> > > > CreationalContextImpl<?>
> > creationalContext)
> > > > +    protected Object
> > > > getContextualInstance(OwbBean<Object>
> > bean)
> > > >      {
> > > >          Object
> > > > webbeansInstance = null;
> > > >
> > > > @@ -117,8 +104,22 @@ public class
> > > > NormalScopedBeanInterceptor
> > > >
> > return
> > > > webbeansInstance;
> > > >          }
> > > >
> > > > +        if (webbeansContext
> > instanceof
> > > > AbstractContext)
> > > > +        {
> > > > +
> > > > CreationalContext<?> cc =
> > > >
> > ((AbstractContext)webbeansContext).getCreationalContext(bean);
> > > > +            if (cc
> > != null)
> > > > +            {
> > > > +
> > > > creationalContext = new
> > > >
> > WeakReference<CreationalContext<?>>(cc);
> > > > +            }
> > > > +        }
> > > > +        if
> > (creationalContext ==
> > > > null)
> > > > +        {
> > > > +            // if
> > there was
> > > > no CreationalContext set from external, we create
> > a new one
> > > > +
> > > > creationalContext = new
> > > >
> > >
> >
> WeakReference<CreationalContext<?>>(CreationalContextFactory.getInstance().getCreationalContext(bean));
> > > > +        }
> > > > +
> > > >          // finally, we
> > > > create a new contextual instance
> > > > -        webbeansInstance =
> > > >
> > webbeansContext.get((Contextual<Object>)this.bean,
> > > > (CreationalContext<Object>)
> > creationalContext);
> > > > +        webbeansInstance =
> > > >
> > webbeansContext.get((Contextual<Object>)this.bean,
> > > > (CreationalContext<Object>)
> > creationalContext.get());
> > > >
> > > >          return
> > > > webbeansInstance;
> > > >      }
> > > >
> > > >
> > > >
> > >
> > > __________________________________________________
> > > Do You Yahoo!?
> > > Sie sind Spam leid? Yahoo! Mail verfügt über einen
> > herausragenden Schutz
> > > gegen Massenmails.
> > > http://mail.yahoo.com
> > >
> >
> >
> >
> > --
> > Gurkan Erdogdu
> > http://gurkanerdogdu.blogspot.com
> >
>
>
> __________________________________________________
> Do You Yahoo!?
> Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz
> gegen Massenmails.
> http://mail.yahoo.com
>



-- 
Gurkan Erdogdu
http://gurkanerdogdu.blogspot.com

Reply via email to