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 2012/04/17 15:33:20 UTC

svn commit: r1327093 - in /openejb/trunk/openejb/container/openejb-core/src: main/java/org/apache/openejb/assembler/classic/ main/java/org/apache/openejb/monitoring/ main/java/org/apache/openejb/resource/jdbc/ test/java/org/apache/openejb/monitoring/

Author: rmannibucau
Date: Tue Apr 17 13:33:19 2012
New Revision: 1327093

URL: http://svn.apache.org/viewvc?rev=1327093&view=rev
Log:
OPENEJB-1822 expose container through jmx

Added:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXBasicDataSource.java
      - copied, changed from r1327072, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/JMXBasicDataSource.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXContainer.java
    openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/monitoring/JMXContainerTest.java
Removed:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/JMXBasicDataSource.java
Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ObjectNameBuilder.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1327093&r1=1327092&r2=1327093&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Tue Apr 17 13:33:19 2012
@@ -16,6 +16,55 @@
  */
 package org.apache.openejb.assembler.classic;
 
+import java.io.File;
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.Instrumentation;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.naming.Binding;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NameAlreadyBoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.work.WorkManager;
+import javax.sql.DataSource;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
+import javax.validation.ValidationException;
+import javax.validation.ValidatorFactory;
 import org.apache.geronimo.connector.GeronimoBootstrapContext;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
 import org.apache.geronimo.connector.work.HintsContextHandler;
@@ -67,6 +116,7 @@ import org.apache.openejb.javaagent.Agen
 import org.apache.openejb.loader.Options;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.monitoring.DynamicMBeanWrapper;
+import org.apache.openejb.monitoring.JMXContainer;
 import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.apache.openejb.monitoring.ObjectNameBuilder;
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
@@ -97,56 +147,6 @@ import org.apache.xbean.recipe.ObjectRec
 import org.apache.xbean.recipe.Option;
 import org.apache.xbean.recipe.UnsetPropertiesRecipe;
 
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.naming.Binding;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameAlreadyBoundException;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.resource.spi.BootstrapContext;
-import javax.resource.spi.ConnectionManager;
-import javax.resource.spi.ManagedConnectionFactory;
-import javax.resource.spi.ResourceAdapter;
-import javax.resource.spi.ResourceAdapterInternalException;
-import javax.resource.spi.XATerminator;
-import javax.resource.spi.work.WorkManager;
-import javax.sql.DataSource;
-import javax.transaction.TransactionManager;
-import javax.transaction.TransactionSynchronizationRegistry;
-import javax.validation.ValidationException;
-import javax.validation.ValidatorFactory;
-import java.io.File;
-import java.io.IOException;
-import java.lang.instrument.ClassFileTransformer;
-import java.lang.instrument.Instrumentation;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
 public class Assembler extends AssemblerTool implements org.apache.openejb.spi.Assembler, JndiConstants {
 
     static {
@@ -157,6 +157,8 @@ public class Assembler extends Assembler
 
     public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, Assembler.class);
 
+    private static final String GLOBAL_UNIQUE_ID = "global";
+
     Messages messages = new Messages(Assembler.class.getPackage().getName());
 
     private final CoreContainerSystem containerSystem;
@@ -168,7 +170,7 @@ public class Assembler extends Assembler
     private final Map<String, AppInfo> deployedApplications = new HashMap<String, AppInfo> ();
     private final List<DeploymentListener> deploymentListeners = new ArrayList<DeploymentListener>();
     private final Set<String> moduleIds = new HashSet<String>();
-    private static final String GLOBAL_UNIQUE_ID = "global";
+    private final Set<ObjectName> containersObjectNames = new HashSet<ObjectName>();
 
 
     public org.apache.openejb.spi.ContainerSystem getContainerSystem() {
@@ -1062,6 +1064,17 @@ public class Assembler extends Assembler
             }
         }
 
+        final Iterator<ObjectName> it = containersObjectNames.iterator();
+        final MBeanServer server = LocalMBeanServer.get();
+        while (it.hasNext()) {
+            try {
+                server.unregisterMBean(it.next());
+            } catch (Exception ignored) {
+                // no-op
+            }
+            it.remove();
+        }
+
         NamingEnumeration<Binding> namingEnumeration = null;
         try {
             namingEnumeration = containerSystem.getJNDIContext().listBindings("openejb/Resource");
@@ -1409,6 +1422,18 @@ public class Assembler extends Assembler
         config.containerSystem.containers.add(serviceInfo);
 
         logger.getChildLogger("service").debug("createService.success", serviceInfo.service, serviceInfo.id, serviceInfo.className);
+
+        if (service instanceof Container) {
+            final ObjectName objectName = ObjectNameBuilder.uniqueName("containers", serviceInfo.id, service);
+            try {
+                LocalMBeanServer.get().registerMBean(new DynamicMBeanWrapper(new JMXContainer(serviceInfo, (Container) service)), objectName);
+                containersObjectNames.add(objectName);
+            } catch (Exception e) {
+                // no-op
+            } catch (NoClassDefFoundError ncdfe) { // OSGi
+                // no-op
+            }
+        }
     }
 
     private void bindService(ServiceInfo serviceInfo, Object service) throws OpenEJBException {

Copied: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXBasicDataSource.java (from r1327072, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/JMXBasicDataSource.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXBasicDataSource.java?p2=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXBasicDataSource.java&p1=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/JMXBasicDataSource.java&r1=1327072&r2=1327093&rev=1327093&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/JMXBasicDataSource.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXBasicDataSource.java Tue Apr 17 13:33:19 2012
@@ -1,16 +1,12 @@
-package org.apache.openejb.resource.jdbc;
+package org.apache.openejb.monitoring;
 
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Statement;
 import javax.management.Description;
-import javax.management.MBeanServer;
 import javax.management.ManagedAttribute;
 import javax.management.ManagedOperation;
 import javax.management.ObjectName;
-import org.apache.openejb.monitoring.DynamicMBeanWrapper;
-import org.apache.openejb.monitoring.LocalMBeanServer;
-import org.apache.openejb.monitoring.ObjectNameBuilder;
 
 // @MBean: don't put it since it is not a pojo
 @Description("describe a datasource pool")
@@ -22,18 +18,9 @@ public class JMXBasicDataSource {
     public JMXBasicDataSource(final String name, final org.apache.commons.dbcp.BasicDataSource ds) {
         this.ds = ds;
 
-        final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
-        jmxName.set("ObjectType", "datasources");
-        jmxName.set("DataSource", name);
-        objectName = jmxName.build();
-
-        final MBeanServer server = LocalMBeanServer.get();
-        if (server.isRegistered(objectName)) {
-            jmxName.set("DataSource", name + "(" + System.identityHashCode(this) + ")");
-            objectName = jmxName.build();
-        }
+        objectName = ObjectNameBuilder.uniqueName("datasources", name, ds);
         try {
-            server.registerMBean(new DynamicMBeanWrapper(this), objectName);
+            LocalMBeanServer.get().registerMBean(new DynamicMBeanWrapper(this), objectName);
         } catch (Exception e) {
             e.printStackTrace(); // TODO
         }

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXContainer.java?rev=1327093&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXContainer.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/JMXContainer.java Tue Apr 17 13:33:19 2012
@@ -0,0 +1,77 @@
+package org.apache.openejb.monitoring;
+
+import java.util.Map;
+import javax.management.Description;
+import javax.management.ManagedAttribute;
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.Container;
+import org.apache.openejb.assembler.classic.ContainerInfo;
+
+@Description("describe a container")
+public class JMXContainer {
+    private final Container container;
+    private final ContainerInfo info;
+
+    public JMXContainer(final ContainerInfo serviceInfo, final Container service) {
+        info = serviceInfo;
+        container = service;
+    }
+
+    @ManagedAttribute
+    @Description("Container id.")
+    public String getContainerId() {
+        return container.getContainerID().toString();
+    }
+
+    @ManagedAttribute
+    @Description("Container type.")
+    public String getContainerType() {
+        return container.getContainerType().name().toLowerCase().replace("_", " ");
+    }
+
+    @ManagedAttribute
+    @Description("Container managed beans.")
+    public String[] getManagedBeans() {
+        final BeanContext[] beans = container.getBeanContexts();
+        final String[] beanNames = new String[beans.length];
+        int i = 0;
+        for (BeanContext bc : beans) {
+            beanNames[i++] = new StringBuilder("bean-class: ").append(bc.getBeanClass().getName()).append(", ")
+                    .append("ejb-name: ").append(bc.getEjbName()).append(", ")
+                    .append("deployment-id: ").append(bc.getDeploymentID()).append(", ")
+                    .toString();
+        }
+        return beanNames;
+    }
+
+    @ManagedAttribute
+    @Description("Container service.")
+    public String getService() {
+        return info.service;
+    }
+
+    @ManagedAttribute
+    @Description("Container class name.")
+    public String getClassName() {
+        return info.className;
+    }
+
+    @ManagedAttribute
+    @Description("Container factory method.")
+    public String getFactoryMethod() {
+        return info.factoryMethod;
+    }
+
+    @ManagedAttribute
+    @Description("Container properties.")
+    public String[] getProperties() {
+        final String[] properties = new String[info.properties.size()];
+        int i = 0;
+        for (Map.Entry<Object, Object> entry : info.properties.entrySet()) {
+            properties[i++] = new StringBuilder(entry.getKey().toString())
+                    .append(" = ").append(entry.getValue().toString())
+                    .toString();
+        }
+        return properties;
+    }
+}

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ObjectNameBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ObjectNameBuilder.java?rev=1327093&r1=1327092&r2=1327093&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ObjectNameBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/ObjectNameBuilder.java Tue Apr 17 13:33:19 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.monitoring;
 
+import javax.management.MBeanServer;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import java.util.LinkedHashMap;
@@ -79,4 +80,18 @@ public class ObjectNameBuilder {
         builder.map.putAll(this.map);
         return builder;
     }
+
+    public static ObjectName uniqueName(final String type, final String name, final Object object) {
+        final ObjectNameBuilder jmxName = new ObjectNameBuilder("openejb.management");
+        jmxName.set("ObjectType", type);
+        jmxName.set("DataSource", name);
+        ObjectName objectName = jmxName.build();
+
+        final MBeanServer server = LocalMBeanServer.get();
+        if (server.isRegistered(objectName)) {
+            jmxName.set("DataSource", name + "(" + System.identityHashCode(object) + ")");
+            objectName = jmxName.build();
+        }
+        return objectName;
+    }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java?rev=1327093&r1=1327092&r2=1327093&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java Tue Apr 17 13:33:19 2012
@@ -25,6 +25,7 @@ import java.sql.SQLFeatureNotSupportedEx
 import java.util.Properties;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Logger;
+import org.apache.openejb.monitoring.JMXBasicDataSource;
 
 @SuppressWarnings({"UnusedDeclaration"})
 public class BasicDataSource extends org.apache.commons.dbcp.BasicDataSource {

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java?rev=1327093&r1=1327092&r2=1327093&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java Tue Apr 17 13:33:19 2012
@@ -24,6 +24,7 @@ import java.util.concurrent.locks.Reentr
 import java.util.logging.Logger;
 import javax.sql.DataSource;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.monitoring.JMXBasicDataSource;
 
 @SuppressWarnings({"UnusedDeclaration"})
 public class BasicManagedDataSource extends org.apache.commons.dbcp.managed.BasicManagedDataSource {

Added: openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/monitoring/JMXContainerTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/monitoring/JMXContainerTest.java?rev=1327093&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/monitoring/JMXContainerTest.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/monitoring/JMXContainerTest.java Tue Apr 17 13:33:19 2012
@@ -0,0 +1,35 @@
+package org.apache.openejb.monitoring;
+
+import java.lang.management.ManagementFactory;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import org.apache.openejb.core.singleton.SingletonContainer;
+import org.apache.openejb.jee.SingletonBean;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.junit.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(ApplicationComposer.class)
+public class JMXContainerTest {
+    @Test
+    public void checkContainerIsRegistered() throws Exception {
+        final ObjectName on = new ObjectName("openejb.management:ObjectType=containers,DataSource=Default Singleton Container");
+        final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        assertTrue(server.isRegistered(on));
+        assertEquals(server.getAttribute(on, "className").toString(), SingletonContainer.class.getName());
+    }
+
+    @Module
+    public SingletonBean persistence() {
+        return new SingletonBean(ABean.class);
+    }
+
+    public static class ABean {
+
+    }
+}
+