Hi

Isnt it fixed now? Mail delay?
Le 16 mai 2014 01:03, "Thiago Veronezi" <[email protected]> a écrit :

> Hi Romain,
>
> This is the revision that breaks the OpenEjbContainerTest that I mentioned
> earlier today. wdyt?
>
> []s,
> Thiago.
>
>
>
>
> On Sat, May 10, 2014 at 3:47 PM, <[email protected]> wrote:
>
> > Author: rmannibucau
> > Date: Sat May 10 19:47:21 2014
> > New Revision: 1593721
> >
> > URL: http://svn.apache.org/r1593721
> > Log:
> > trying to avoid to create local bean lazily which creates a bottleneck +
> > thread safety in cdiplugin
> >
> > Modified:
> >
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> >
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> >
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
> >
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java
> >
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
> >
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointFactory.java
> >
> > Modified:
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> > URL:
> >
> http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1593721&r1=1593720&r2=1593721&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> > (original)
> > +++
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
> > Sat May 10 19:47:21 2014
> > @@ -1816,4 +1816,16 @@ public class BeanContext extends Deploym
> >          private Class localInterface;
> >          private Method createMethod;
> >      }
> > +
> > +    public static final class ProxyClass {
> > +        private final Class<?> proxy;
> > +
> > +        public ProxyClass(final Class<?> proxy) {
> > +            this.proxy = proxy;
> > +        }
> > +
> > +        public Class<?> getProxy() {
> > +            return proxy;
> > +        }
> > +    }
> >  }
> >
> > Modified:
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> > URL:
> >
> http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1593721&r1=1593720&r2=1593721&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> > (original)
> > +++
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> > Sat May 10 19:47:21 2014
> > @@ -72,6 +72,7 @@ import org.apache.openejb.core.ServerFed
> >  import org.apache.openejb.core.SimpleTransactionSynchronizationRegistry;
> >  import
> org.apache.openejb.core.TransactionSynchronizationRegistryWrapper;
> >  import org.apache.openejb.core.WebContext;
> > +import org.apache.openejb.core.ivm.IntraVmProxy;
> >  import org.apache.openejb.core.ivm.naming.ContextualJndiReference;
> >  import org.apache.openejb.core.ivm.naming.IvmContext;
> >  import org.apache.openejb.core.ivm.naming.IvmJndiFactory;
> > @@ -124,6 +125,7 @@ import org.apache.openejb.util.SuperProp
> >  import org.apache.openejb.util.URLs;
> >  import org.apache.openejb.util.classloader.ClassLoaderAwareHandler;
> >  import org.apache.openejb.util.classloader.URLClassLoaderFirst;
> > +import org.apache.openejb.util.proxy.LocalBeanProxyFactory;
> >  import org.apache.openejb.util.proxy.ProxyFactory;
> >  import org.apache.openejb.util.proxy.ProxyManager;
> >  import org.apache.webbeans.config.WebBeansContext;
> > @@ -147,6 +149,7 @@ import javax.enterprise.context.Dependen
> >  import javax.enterprise.context.spi.CreationalContext;
> >  import javax.enterprise.inject.spi.Bean;
> >  import javax.enterprise.inject.spi.BeanManager;
> > +import javax.jms.MessageListener;
> >  import javax.management.InstanceNotFoundException;
> >  import javax.management.MBeanRegistrationException;
> >  import javax.management.MBeanServer;
> > @@ -1062,6 +1065,27 @@ public class Assembler extends Assembler
> >
> >  beanContext.setMethodTransactionAttribute(entry.getKey(),
> > TransactionType.Required);
> >                      }
> >                  }
> > +
> > +                // if local bean or mdb generate proxy class now to
> avoid
> > bottleneck on classloader later
> > +                if (beanContext.isLocalbean() ||
> >
> beanContext.getBusinessLocalInterfaces().contains(MessageListener.class)) {
> > +                    final List<Class> interfaces = new
> > ArrayList<Class>(3);
> > +                    interfaces.add(Serializable.class);
> > +                    interfaces.add(IntraVmProxy.class);
> > +                    final BeanType type =
> beanContext.getComponentType();
> > +                    if (BeanType.STATEFUL.equals(type) ||
> > BeanType.MANAGED.equals(type)) {
> > +                        interfaces.add(BeanContext.Removable.class);
> > +                    }
> > +
> > +                    beanContext.set(
> > +                            BeanContext.ProxyClass.class,
> > +                            new BeanContext.ProxyClass(
> > +                                LocalBeanProxyFactory.createProxy(
> > +                                    beanContext.getBeanClass(),
> > +                                    beanContext.getClassLoader(),
> > +                                    interfaces.toArray(new
> > Class<?>[interfaces.size()])
> > +                                )
> > +                            ));
> > +                }
> >              }
> >              // process application exceptions
> >              for (final ApplicationExceptionInfo exceptionInfo :
> > ejbJar.applicationException) {
> >
> > Modified:
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
> > URL:
> >
> http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java?rev=1593721&r1=1593720&r2=1593721&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
> > (original)
> > +++
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
> > Sat May 10 19:47:21 2014
> > @@ -193,62 +193,74 @@ public class CdiPlugin extends AbstractO
> >              return instance;
> >          }
> >
> > -        final Class<? extends Annotation> scopeClass =
> inBean.getScope();
> > -        final CdiEjbBean<Object> cdiEjbBean = (CdiEjbBean<Object>)
> inBean;
> > -        final CreationalContext<Object> cc = (CreationalContext<Object>)
> > creationalContext;
> > -
> > -        if (scopeClass == null || Dependent.class == scopeClass) { // no
> > need to add any layer, null = @New
> > -            return cdiEjbBean.createEjb(cc);
> > -        }
> > -
> > -        // only stateful normally
> > -        final InstanceBean<Object> bean = new
> > InstanceBean<Object>(cdiEjbBean);
> > -        if
> > (webBeansContext.getBeanManagerImpl().isNormalScope(scopeClass)) {
> > -            final BeanContext beanContext = cdiEjbBean.getBeanContext();
> > -            final Provider provider =
> >
> webBeansContext.getNormalScopeProxyFactory().getInstanceProvider(beanContext.getClassLoader(),
> > cdiEjbBean);
> > -
> > -            if (!beanContext.isLocalbean()) {
> > -                final List<Class> interfaces = new ArrayList<Class>();
> > -                final InterfaceType type =
> > beanContext.getInterfaceType(interfce);
> > -                if (type != null) {
> > -                    interfaces.addAll(beanContext.getInterfaces(type));
> > -                } else { // can happen when looked up from impl instead
> > of API in OWB -> default to business local
> > -
> >
>  interfaces.addAll(beanContext.getInterfaces(InterfaceType.BUSINESS_LOCAL));
> > -                }
> > -                interfaces.add(Serializable.class);
> > -                interfaces.add(IntraVmProxy.class);
> > -                if
> > (BeanType.STATEFUL.equals(beanContext.getComponentType()) ||
> > BeanType.MANAGED.equals(beanContext.getComponentType())) {
> > -                    interfaces.add(BeanContext.Removable.class);
> > -                }
> > +        synchronized (inBean) { // singleton for the app so safe to sync
> > on it
> > +            instance = cacheProxies.get(inBean);
> > +            if (instance != null) {
> > +                return instance;
> > +            }
> > +
> > +            final Class<? extends Annotation> scopeClass =
> > inBean.getScope();
> > +            final CdiEjbBean<Object> cdiEjbBean = (CdiEjbBean<Object>)
> > inBean;
> > +            final CreationalContext<Object> cc =
> > (CreationalContext<Object>) creationalContext;
> > +
> > +            if (scopeClass == null || Dependent.class == scopeClass) {
> //
> > no need to add any layer, null = @New
> > +                return cdiEjbBean.createEjb(cc);
> > +            }
> > +
> > +            // only stateful normally
> > +            final InstanceBean<Object> bean = new
> > InstanceBean<Object>(cdiEjbBean);
> > +            if
> > (webBeansContext.getBeanManagerImpl().isNormalScope(scopeClass)) {
> > +                final BeanContext beanContext =
> > cdiEjbBean.getBeanContext();
> > +                final Provider provider =
> >
> webBeansContext.getNormalScopeProxyFactory().getInstanceProvider(beanContext.getClassLoader(),
> > cdiEjbBean);
> > +
> > +                if (!beanContext.isLocalbean()) {
> > +                    final List<Class> interfaces = new
> ArrayList<Class>();
> > +                    final InterfaceType type =
> > beanContext.getInterfaceType(interfce);
> > +                    if (type != null) {
> > +
> >  interfaces.addAll(beanContext.getInterfaces(type));
> > +                    } else { // can happen when looked up from impl
> > instead of API in OWB -> default to business local
> > +
> >
>  interfaces.addAll(beanContext.getInterfaces(InterfaceType.BUSINESS_LOCAL));
> > +                    }
> > +                    interfaces.add(Serializable.class);
> > +                    interfaces.add(IntraVmProxy.class);
> > +                    if
> > (BeanType.STATEFUL.equals(beanContext.getComponentType()) ||
> > BeanType.MANAGED.equals(beanContext.getComponentType())) {
> > +                        interfaces.add(BeanContext.Removable.class);
> > +                    }
> >
> > -                try {
> > -                    instance =
> > ProxyManager.newProxyInstance(interfaces.toArray(new
> > Class<?>[interfaces.size()]), new InvocationHandler() {
> > -                        @Override
> > -                        public Object invoke(final Object proxy, final
> > Method method, final Object[] args) throws Throwable {
> > -                            try {
> > -                                return method.invoke(provider.get(),
> > args);
> > -                            } catch (final InvocationTargetException
> ite)
> > {
> > -                                throw ite.getCause();
> > +                    try {
> > +                        instance =
> > ProxyManager.newProxyInstance(interfaces.toArray(new
> > Class<?>[interfaces.size()]), new InvocationHandler()
> > +                        {
> > +                            @Override
> > +                            public Object invoke(final Object proxy,
> > final Method method, final Object[] args) throws Throwable
> > +                            {
> > +                                try
> > +                                {
> > +                                    return method.invoke(provider.get(),
> > args);
> > +                                }
> > +                                catch (final InvocationTargetException
> > ite)
> > +                                {
> > +                                    throw ite.getCause();
> > +                                }
> >                              }
> > -                        }
> > -                    });
> > -                } catch (final IllegalAccessException e) {
> > -                    throw new OpenEJBRuntimeException(e);
> > +                        });
> > +                    } catch (final IllegalAccessException e) {
> > +                        throw new OpenEJBRuntimeException(e);
> > +                    }
> > +
> > +                } else {
> > +                    final NormalScopeProxyFactory
> normalScopeProxyFactory
> > = webBeansContext.getNormalScopeProxyFactory();
> > +                    final Class<?> proxyClass =
> > normalScopeProxyFactory.createProxyClass(beanContext.getClassLoader(),
> > beanContext.getBeanClass());
> > +                    instance =
> > normalScopeProxyFactory.createProxyInstance(proxyClass, provider);
> >                  }
> >
> > +                cacheProxies.put(inBean, instance);
> >              } else {
> > -                final NormalScopeProxyFactory normalScopeProxyFactory =
> > webBeansContext.getNormalScopeProxyFactory();
> > -                final Class<?> proxyClass =
> > normalScopeProxyFactory.createProxyClass(beanContext.getClassLoader(),
> > beanContext.getBeanClass());
> > -                instance =
> > normalScopeProxyFactory.createProxyInstance(proxyClass, provider);
> > +                final Context context =
> > webBeansContext.getBeanManagerImpl().getContext(scopeClass);
> > +                instance = context.get(bean, cc);
> >              }
> > -
> > -            cacheProxies.put(inBean, instance);
> > -        } else {
> > -            final Context context =
> > webBeansContext.getBeanManagerImpl().getContext(scopeClass);
> > -            instance = context.get(bean, cc);
> > +            bean.setOwbProxy(instance);
> > +            return instance;
> >          }
> > -        bean.setOwbProxy(instance);
> > -        return instance;
> >      }
> >
> >      @Override
> >
> > Modified:
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java
> > URL:
> >
> http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java?rev=1593721&r1=1593720&r2=1593721&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java
> > (original)
> > +++
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/BaseSessionContext.java
> > Sat May 10 19:47:21 2014
> > @@ -141,14 +141,7 @@ public abstract class BaseSessionContext
> >              }
> >
> >              if (InterfaceType.LOCALBEAN.equals(interfaceType)) {
> > -                final List<Class> interfaces = new ArrayList<Class>(3);
> > -                interfaces.add(Serializable.class);
> > -                interfaces.add(IntraVmProxy.class);
> > -                if (BeanType.STATEFUL.equals(type) ||
> > BeanType.MANAGED.equals(type)) {
> > -                    interfaces.add(BeanContext.Removable.class);
> > -                }
> > -
> > -                return
> > LocalBeanProxyFactory.newProxyInstance(di.getClassLoader(), handler,
> > di.getBeanClass(), interfaces.toArray(new Class<?>[interfaces.size()]));
> > +                return
> >
> LocalBeanProxyFactory.constructProxy(di.get(BeanContext.ProxyClass.class).getProxy(),
> > handler);
> >              } else {
> >                  final List<Class> interfaces = new ArrayList<Class>();
> >                  interfaces.addAll(di.getInterfaces(interfaceType));
> >
> > Modified:
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
> > URL:
> >
> http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java?rev=1593721&r1=1593720&r2=1593721&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
> > (original)
> > +++
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/EjbHomeProxyHandler.java
> > Sat May 10 19:47:21 2014
> > @@ -157,16 +157,7 @@ public abstract class EjbHomeProxyHandle
> >              // TODO Is it correct for ManagedBean injection via managed
> > bean class?
> >              if ((InterfaceType.LOCALBEAN.equals(objectInterfaceType) ||
> > getBeanContext().getComponentType().equals(BeanType.MANAGED))
> >                  && !getBeanContext().isDynamicallyImplemented()) {
> > -                final List<Class> interfaces = new ArrayList<Class>(3);
> > -                interfaces.add(Serializable.class);
> > -                interfaces.add(IntraVmProxy.class);
> > -                if (BeanType.STATEFUL.equals(type) ||
> > BeanType.MANAGED.equals(type)) {
> > -                    interfaces.add(BeanContext.Removable.class);
> > -                }
> > -                return
> >
> LocalBeanProxyFactory.newProxyInstance(handler.getBeanContext().getClassLoader(),
> > -                                                              handler,
> > -
> >  handler.getBeanContext().getBeanClass(),
> > -
> >  interfaces.toArray(new Class<?>[interfaces.size()]));
> > +                return
> >
> LocalBeanProxyFactory.constructProxy(handler.getBeanContext().get(BeanContext.ProxyClass.class).getProxy(),
> > handler);
> >              } else {
> >                  final List<Class> proxyInterfaces = new
> > ArrayList<Class>(handler.getInterfaces().size() + 2);
> >                  proxyInterfaces.addAll(handler.getInterfaces());
> >
> > Modified:
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointFactory.java
> > URL:
> >
> http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointFactory.java?rev=1593721&r1=1593720&r2=1593721&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointFactory.java
> > (original)
> > +++
> >
> tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/EndpointFactory.java
> > Sat May 10 19:47:21 2014
> > @@ -67,8 +67,8 @@ public class EndpointFactory implements
> >          }
> >          final EndpointHandler endpointHandler = new
> > EndpointHandler(container, beanContext, instanceFactory, xaResource);
> >          try {
> > -            return (MessageEndpoint)
> > LocalBeanProxyFactory.newProxyInstance(beanContext.getClassLoader(),
> > endpointHandler, beanContext.getBeanClass(), interfaces);
> > -        } catch (final InternalError e) {
> > +            return (MessageEndpoint)
> >
> LocalBeanProxyFactory.constructProxy(beanContext.get(BeanContext.ProxyClass.class).getProxy(),
> > endpointHandler);
> > +        } catch (final InternalError e) { // should be useless
> >              //try to create the proxy with tccl once again.
> >              try {
> >                  return
> >
> MessageEndpoint.class.cast(LocalBeanProxyFactory.newProxyInstance(Thread.currentThread().getContextClassLoader(),
> > endpointHandler, beanContext.getBeanClass(), interfaces));
> >
> >
> >
>

Reply via email to