You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by dj...@apache.org on 2008/02/28 18:10:58 UTC
svn commit: r632059 - in /db/derby/code/trunk/java:
engine/org/apache/derby/impl/services/jmx/
engine/org/apache/derby/impl/services/jmxnone/
engine/org/apache/derby/mbeans/
testing/org/apache/derbyTesting/functionTests/tests/management/
Author: djd
Date: Thu Feb 28 09:10:55 2008
New Revision: 632059
URL: http://svn.apache.org/viewvc?rev=632059&view=rev
Log:
DERBY-3466 Add a system identifier to the ObjectName of MBeans registered by Derby to allow disambiguating Derby's MBeans when multiple systems are loaded through different class loaders.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java
db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java
db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java
db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java
db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java
db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmx/JMXManagementService.java Thu Feb 28 09:10:55 2008
@@ -18,6 +18,7 @@
package org.apache.derby.impl.services.jmx;
import java.lang.management.ManagementFactory;
+import java.security.AccessControlException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
@@ -42,6 +43,7 @@
import org.apache.derby.iapi.services.property.PropertyUtil;
import org.apache.derby.mbeans.ManagementMBean;
import org.apache.derby.mbeans.VersionMBean;
+import org.apache.derby.security.SystemPermission;
/**
* This class implements the ManagementService interface and provides a simple
@@ -79,6 +81,14 @@
private ObjectName myManagementBean;
private MBeanServer myManagementServer;
+
+ /**
+ * Runtime value to disambiguate
+ * multiple Derby systems in the same virtual machine but
+ * different class loaders. Set as the system attribute in
+ * the ObjectName for all MBeans registered.
+ */
+ private String systemIdentifier;
public JMXManagementService() {
@@ -98,6 +108,9 @@
registeredMbeans = new HashMap<ObjectName,StandardMBean>();
+ systemIdentifier =
+ Monitor.getMonitor().getUUIDFactory().createUUID().toString();
+
findServer();
myManagementBean = (ObjectName) registerMBean(this,
@@ -186,7 +199,8 @@
try {
final ObjectName beanName = new ObjectName(
- DERBY_JMX_DOMAIN + ":" + keyProperties);
+ DERBY_JMX_DOMAIN + ":" + keyProperties
+ + ",system=" + systemIdentifier);
final StandardMBean standardMBean =
new StandardMBean(bean, beanInterface) {
@@ -307,6 +321,8 @@
if (registeredMbeans == null)
return;
+ checkJMXControl();
+
// Already active?
if (isManagementActive())
return;
@@ -339,6 +355,8 @@
if (registeredMbeans == null)
return;
+ checkJMXControl();
+
if (isManagementActive()) {
for (ObjectName mbeanName : registeredMbeans.keySet())
{
@@ -351,5 +369,22 @@
}
mbeanServer = null;
}
+ }
+
+ private void checkJMXControl() {
+ /* FUTURE DERBY-3462
+ try {
+ AccessController.checkPermission(new SystemPermission("jmxControl"));
+ } catch (AccessControlException e) {
+ // Need to throw a simplified version as AccessControlException
+ // will have a reference to Derby's SystemPermission which most likely
+ // will not be available on the client.
+ throw new SecurityException(e.getMessage());
+ }
+ */
+ }
+
+ public String getSystemIdentifier() {
+ return systemIdentifier;
}
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/jmxnone/NoManagementService.java Thu Feb 28 09:10:55 2008
@@ -41,4 +41,7 @@
}
public void stopManagement() {
}
+ public String getSystemIdentifier() {
+ return null;
+ }
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/JDBCMBean.java Thu Feb 28 09:10:55 2008
@@ -26,7 +26,8 @@
* <P>
* Key properties for registered MBean:
* <UL>
- * <LI> type=JDBC
+ * <LI> <code>type=JDBC</code>
+ * <LI> <code>system=</code><em>runtime system identifier</em> (see overview)
* </UL>
*/
public interface JDBCMBean {
Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/Management.java Thu Feb 28 09:10:55 2008
@@ -73,4 +73,15 @@
return false;
return mgmtService.isManagementActive();
}
+
+ /**
+ * Return the system identifier that this MBean is managing.
+ * @see ManagementMBean#getSystemIdentifier()
+ */
+ public String getSystemIdentifier() {
+ ManagementMBean mgmtService = getManagementService();
+ if (mgmtService == null)
+ return null;
+ return mgmtService.getSystemIdentifier();
+ }
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/ManagementMBean.java Thu Feb 28 09:10:55 2008
@@ -33,10 +33,12 @@
* <P>
* Key properties for registered MBean when registered by Derby:
* <UL>
- * <LI> type=Management
+ * <LI> <code>type=Management</code>
+ * <LI> <code>system=</code><em>runtime system identifier</em> (see overview)
* </UL>
*
* @see Management
+ * @see ManagementMBean#getSystemIdentifier()
*/
public interface ManagementMBean {
@@ -47,6 +49,15 @@
* registered any beans.
*/
public boolean isManagementActive();
+
+ /**
+ * Get the system identifier that this MBean is managing.
+ * The system identifier is a runtime value to disambiguate
+ * multiple Derby systems in the same virtual machine but
+ * different class loaders.
+ * @return Runtime identifier for the system, null if Derby is not running.
+ */
+ public String getSystemIdentifier();
/**
* Inform Derby to start its JMX management by registering
Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/VersionMBean.java Thu Feb 28 09:10:55 2008
@@ -32,8 +32,9 @@
* <P>
* Key properties for registered MBean:
* <UL>
- * <LI> type=Version
- * <LI> jar={derby.jar|derbynet.jar}
+ * <LI> <code>type=Version</code>
+ * <LI> <code>jar={derby.jar|derbynet.jar}</code>
+ * <LI> <code>system=</code><em>runtime system identifier</em> (see overview)
* </UL>
*/
public interface VersionMBean {
Modified: db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/mbeans/package.html Thu Feb 28 09:10:55 2008
@@ -21,8 +21,20 @@
a number of MBeans to monitor and manage Derby.
<P>
Derby registers its JMX MBeans in the <code>org.apache.derby</code> domain and
-always includes a value for <code>type</code> in the MBean's ObjectName's key
+always includes values for <code>type</code> and <code>system</code> in the MBean's ObjectName's key
properties. Other key properties are described in the interface class for the MBean.
+<UL>
+<LI> <code>type</code> Set to the class name of the MBean's interface class without
+the package and without <code>MBean</code>. E.g. for <code>org.apache.derby.mbeans.VersionMBean</code>
+the key property <code>type</code> will be set to <code>Version</code>. The javadoc for each MBean
+also indicates what <code>type</code> will be set to.
+<LI> <code>system</code> Set to a runtime identifier that allows Derby and applications
+to disambiguate multiple Derby systems in the same virtual machine but different class loaders.
+Currently a new value is created each time Derby is booted. An application may discover the
+value of the identifier by registering the MBean <code>org.apache.derby.mbeans.Management</code>
+and accessing the <code>SystemIdentifier</code>. This application created <code>ManagementMBean</code>
+must be running in the same class loader as Derby.
+</UL>
<P>
Derby registers the class name for any MBean to be the interface class for the MBean
(i.e. <code>org.apache.derby.mbeans.*MBean</code>) to hide the implementation class
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/JMXTest.java Thu Feb 28 09:10:55 2008
@@ -21,11 +21,15 @@
package org.apache.derbyTesting.functionTests.tests.management;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.sql.SQLException;
import java.util.Set;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
+import javax.sql.DataSource;
import junit.framework.Test;
@@ -71,6 +75,15 @@
// Is the class name in the public api
assertTrue(mbeanClassName.startsWith("org.apache.derby.mbeans."));
+ // See if it was the application created ManagementMBean
+ // This will have the implementation class registered
+ // as the class name since it is not registered by Derby.
+ if ("Management".equals(type)
+ && "org.apache.derby.mbeans.Management".equals(mbeanClassName))
+ {
+ continue;
+ }
+
// and is a Derby specific MBean.
assertTrue(mbeanClassName.endsWith("MBean"));
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/MBeanTest.java Thu Feb 28 09:10:55 2008
@@ -23,6 +23,7 @@
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Hashtable;
import java.util.Set;
import javax.management.MBeanServerConnection;
@@ -225,6 +226,24 @@
}
return mgmtObjName;
+ }
+
+ /**
+ * Get the ObjectName for an MBean registered by Derby for a set of
+ * key properties. The ObjectName has the org.apache.derby and
+ * the key property <code>system</code> will be set to the system identifier
+ * for the Derby system under test (if Derby is running).
+ * @param keyProperties Set of key properties, may be modified by this call.
+ * @return ObjectName to access MBean.
+ */
+ protected ObjectName getDerbyMBeanName(Hashtable<String,String> keyProperties)
+ throws Exception
+ {
+ String systemIdentifier = (String)
+ getAttribute(getApplicationManagementMBean(), "SystemIdentifier");
+ if (systemIdentifier != null)
+ keyProperties.put("system", systemIdentifier);
+ return new ObjectName("org.apache.derby", keyProperties);
}
/**
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/ManagementMBeanTest.java Thu Feb 28 09:10:55 2008
@@ -79,9 +79,11 @@
invokeOperation(mbean, "stopManagement");
assertBooleanAttribute(false, mbean, "ManagementActive");
- // leaving only management MBeans.
+ // leaving only management MBeans, the one registered
+ // by this test and the one registered by Derby
+ // (which has the system key property).
Set<ObjectName> managementOnly = getDerbyDomainMBeans();
- assertEquals(1, managementOnly.size());
+ assertEquals(2, managementOnly.size());
for (ObjectName name : managementOnly)
{
assertEquals("Management", name.getKeyProperty("type"));
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java?rev=632059&r1=632058&r2=632059&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/management/VersionMBeanTest.java Thu Feb 28 09:10:55 2008
@@ -74,13 +74,13 @@
* @throws MalformedObjectNameException if the object name is not valid
*/
private ObjectName getDerbyJarObjectName()
- throws MalformedObjectNameException {
+ throws Exception {
// get a reference to the VersionMBean instance for derby.jar
Hashtable<String, String> keyProps = new Hashtable<String, String>();
keyProps.put("type", "Version");
keyProps.put("jar", "derby.jar");
- return new ObjectName("org.apache.derby", keyProps);
+ return getDerbyMBeanName(keyProps);
}
//