diff -Naur --strip-trailing-cr jmx.old/AbstractDynamicMBean.java jmx/AbstractDynamicMBean.java --- jmx.old/AbstractDynamicMBean.java 2005-12-05 03:00:54.000000000 +0100 +++ jmx/AbstractDynamicMBean.java 2006-08-14 14:02:41.530518400 +0200 @@ -17,6 +17,7 @@ package org.apache.log4j.jmx; //import java.lang.reflect.Constructor; +import java.util.Collection; import java.util.Iterator; import javax.management.DynamicMBean; import javax.management.AttributeList; @@ -25,6 +26,10 @@ import javax.management.MBeanRegistration; import javax.management.MBeanServer; import javax.management.ObjectName; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; +import javax.management.MBeanRegistrationException; +import javax.management.NotCompliantMBeanException; import org.apache.log4j.Logger; @@ -33,6 +38,9 @@ String dClassName; MBeanServer server; + + /** List of MBean names which are registered internally. */ + private Collection mbeanList = new java.util.LinkedList(); /** * Enables the to get the values of several attributes of the Dynamic MBean. @@ -112,10 +120,37 @@ } + /** + * Registers MBean instance in the attached server. Must NOT + * be called before registration if this instance. + */ + protected + void registerMBean(Object mbean, ObjectName objectName) + throws InstanceAlreadyExistsException, MBeanRegistrationException, + NotCompliantMBeanException { + server.registerMBean(mbean, objectName); + mbeanList.add(objectName); + } + /** + * Performs cleanup for deregistering this MBean. Default implementation + * unregisters MBean instances which are registered using + * {@link #registerMBean(Object mbean, ObjectName objectName)}. + */ public void preDeregister() { getLogger().debug("preDeregister called."); + Iterator iterator = mbeanList.iterator(); + while (iterator.hasNext()) { + ObjectName name = (ObjectName) iterator.next(); + try { + server.unregisterMBean(name); + } catch (InstanceNotFoundException e) { + getLogger().warn("Missing MBean " + name.getCanonicalName()); + } catch (MBeanRegistrationException e) { + getLogger().warn("Failed unregistering " + name.getCanonicalName()); + } + } } public diff -Naur --strip-trailing-cr jmx.old/AppenderDynamicMBean.java jmx/AppenderDynamicMBean.java --- jmx.old/AppenderDynamicMBean.java 2006-08-14 13:42:53.782620000 +0200 +++ jmx/AppenderDynamicMBean.java 2006-08-14 14:00:04.344496000 +0200 @@ -192,7 +192,7 @@ try { LayoutDynamicMBean appenderMBean = new LayoutDynamicMBean(layout); objectName = new ObjectName("log4j:appender="+name); - server.registerMBean(appenderMBean, objectName); + registerMBean(appenderMBean, objectName); dAttributes.add(new MBeanAttributeInfo("appender="+name, "javax.management.ObjectName", diff -Naur --strip-trailing-cr jmx.old/HierarchyDynamicMBean.java jmx/HierarchyDynamicMBean.java --- jmx.old/HierarchyDynamicMBean.java 2006-08-14 13:42:49.967134000 +0200 +++ jmx/HierarchyDynamicMBean.java 2006-08-14 14:12:29.305697600 +0200 @@ -117,7 +117,7 @@ try { LoggerDynamicMBean loggerMBean = new LoggerDynamicMBean(logger); objectName = new ObjectName("log4j", "logger", name); - server.registerMBean(loggerMBean, objectName); + registerMBean(loggerMBean, objectName); NotificationFilterSupport nfs = new NotificationFilterSupport(); nfs.enableType(ADD_APPENDER+logger.getName()); diff -Naur --strip-trailing-cr jmx.old/LoggerDynamicMBean.java jmx/LoggerDynamicMBean.java --- jmx.old/LoggerDynamicMBean.java 2005-12-05 03:00:52.000000000 +0100 +++ jmx/LoggerDynamicMBean.java 2006-08-14 13:59:59.807972800 +0200 @@ -257,7 +257,7 @@ try { AppenderDynamicMBean appenderMBean = new AppenderDynamicMBean(appender); objectName = new ObjectName("log4j", "appender", name); - server.registerMBean(appenderMBean, objectName); + registerMBean(appenderMBean, objectName); dAttributes.add(new MBeanAttributeInfo("appender="+name, "javax.management.ObjectName",