You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/02/18 00:28:55 UTC

svn commit: r1447101 - /tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java

Author: rmannibucau
Date: Sun Feb 17 23:28:55 2013
New Revision: 1447101

URL: http://svn.apache.org/r1447101
Log:
correct handling o flifecycle for cdi mbeans

Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java

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=1447101&r1=1447100&r2=1447101&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 Sun Feb 17 23:28:55 2013
@@ -211,6 +211,7 @@ public class Assembler extends Assembler
     private SecurityService securityService;
     protected OpenEjbConfigurationFactory configFactory;
     private final Map<String, AppInfo> deployedApplications = new HashMap<String, AppInfo>();
+    private final Map<ObjectName, CreationalContext> creationalContextForAppMbeans = new HashMap<ObjectName, CreationalContext>();
     private final Set<String> moduleIds = new HashSet<String>();
     private final Set<ObjectName> containerObjectNames = new HashSet<ObjectName>();
     private final RemoteResourceMonitor remoteResourceMonitor = new RemoteResourceMonitor();
@@ -1005,36 +1006,36 @@ public class Assembler extends Assembler
     }
 
     @SuppressWarnings("unchecked")
-    private static void deployMBean(final WebBeansContext wc, final ClassLoader cl, final String mbeanClass, final Properties appMbeans, final String id) {
-        final Class<?> clazz;
-        try {
-            clazz = cl.loadClass(mbeanClass);
-        } catch (ClassNotFoundException e) {
-            throw new OpenEJBRuntimeException(e);
-        }
-        final BeanManager bm = wc.getBeanManagerImpl();
-        final Set<Bean<?>> beans = bm.getBeans(clazz);
-        final Bean bean = bm.resolve(beans);
-        final Object instance;
-        if (bean == null) {
-            try {
-                instance = clazz.newInstance();
-            } catch (InstantiationException e) {
-                logger.error("the mbean " + mbeanClass + " can't be registered because it can't be instantiated", e);
-                return;
-            } catch (IllegalAccessException e) {
-                logger.error("the mbean " + mbeanClass + " can't be registered because it can't be accessed", e);
-                return;
+    private void deployMBean(final WebBeansContext wc, final ClassLoader cl, final String mbeanClass, final Properties appMbeans, final String id) {
+        if (LocalMBeanServer.isJMXActive()) {
+            final Class<?> clazz;
+            try {
+                clazz = cl.loadClass(mbeanClass);
+            } catch (ClassNotFoundException e) {
+                throw new OpenEJBRuntimeException(e);
             }
-        } else {
-            final CreationalContext creationalContext = bm.createCreationalContext(bean);
-            instance = bm.getReference(bean, clazz, creationalContext);
-            if (Dependent.class.equals(bean.getScope())) {
-                creationalContext.release();
+
+            final BeanManager bm = wc.getBeanManagerImpl();
+            final Set<Bean<?>> beans = bm.getBeans(clazz);
+            final Bean bean = bm.resolve(beans);
+            final Object instance;
+            final CreationalContext creationalContext;
+            if (bean == null) {
+                try {
+                    instance = clazz.newInstance();
+                } catch (InstantiationException e) {
+                    logger.error("the mbean " + mbeanClass + " can't be registered because it can't be instantiated", e);
+                    return;
+                } catch (IllegalAccessException e) {
+                    logger.error("the mbean " + mbeanClass + " can't be registered because it can't be accessed", e);
+                    return;
+                }
+                creationalContext = null;
+            } else {
+                creationalContext = bm.createCreationalContext(bean);
+                instance = bm.getReference(bean, clazz, creationalContext);
             }
-        }
 
-        if (LocalMBeanServer.isJMXActive()) {
             final MBeanServer server = LocalMBeanServer.get();
             try {
                 final ObjectName leaf = new ObjectNameBuilder("openejb.user.mbeans")
@@ -1045,6 +1046,9 @@ public class Assembler extends Assembler
 
                 server.registerMBean(new DynamicMBeanWrapper(wc, instance), leaf);
                 appMbeans.put(mbeanClass, leaf.getCanonicalName());
+                if (Dependent.class.equals(bean.getScope())) {
+                    creationalContextForAppMbeans.put(leaf, creationalContext);
+                }
                 logger.info("Deployed MBean(" + leaf.getCanonicalName() + ")");
             } catch (Exception e) {
                 logger.error("the mbean " + mbeanClass + " can't be registered", e);
@@ -1480,6 +1484,10 @@ public class Assembler extends Assembler
                 if (server.isRegistered(on)) {
                     server.unregisterMBean(on);
                 }
+                final CreationalContext cc = creationalContextForAppMbeans.remove(on);
+                if (cc != null) {
+                    cc.release();
+                }
             } catch (InstanceNotFoundException e) {
                 logger.warning("can't unregister " + objectName + " because the mbean was not found", e);
             } catch (MBeanRegistrationException e) {