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 {
+
+ }
+}
+