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