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));