Author: psmith Date: Thu Aug 14 20:31:30 2008 New Revision: 686131 URL: http://svn.apache.org/viewvc?rev=686131&view=rev Log: Bug 40246 Added cleaned up patch provided by wing tung Leung to allow the JMX Beans created to properly deregister, allowing Servlet Containers that shutdown/restart to be able to (re)register new JMX beans of the same name.
Modified: logging/log4j/trunk/src/changes/changes.xml logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AppenderDynamicMBean.java logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/LoggerDynamicMBean.java Modified: logging/log4j/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/changes/changes.xml?rev=686131&r1=686130&r2=686131&view=diff ============================================================================== --- logging/log4j/trunk/src/changes/changes.xml (original) +++ logging/log4j/trunk/src/changes/changes.xml Thu Aug 14 20:31:30 2008 @@ -56,6 +56,7 @@ <action action="fix" issue="40888">Weekly rotation problem in Europe.</action> <action action="fix" issue="43282">Add OSGi packaging info.</action> <action action="fix" issue="44157">InterruptedIOException ignored by log4j.</action> + <action action="fix" issue="40246">HierarchyDynamicMBean missing unregister MBean</action> </release> <release version="1.2.15" date="2007-08-24" description="SyslogAppender enhancements, NTEventLogAppender and Maven build."> Modified: logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java?rev=686131&r1=686130&r2=686131&view=diff ============================================================================== --- logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java (original) +++ logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AbstractDynamicMBean.java Thu Aug 14 20:31:30 2008 @@ -17,25 +17,31 @@ package org.apache.log4j.jmx; -//import java.lang.reflect.Constructor; - -import org.apache.log4j.Logger; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.Vector; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.DynamicMBean; +import javax.management.InstanceAlreadyExistsException; +import javax.management.InstanceNotFoundException; import javax.management.JMException; import javax.management.MBeanRegistration; +import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; +import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.management.RuntimeOperationsException; -import java.util.Iterator; + +import org.apache.log4j.Logger; public abstract class AbstractDynamicMBean implements DynamicMBean, MBeanRegistration { String dClassName; MBeanServer server; + private final Vector mbeanList = new Vector(); /** * Enables the to get the values of several attributes of the Dynamic MBean. @@ -121,17 +127,44 @@ public - void preDeregister() { - getLogger().debug("preDeregister called."); - } - - public ObjectName preRegister(MBeanServer server, ObjectName name) { getLogger().debug("preRegister called. Server="+server+ ", name="+name); this.server = server; return name; } + /** + * Registers MBean instance in the attached server. Must <em>NOT</em> + * be called before registration of 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 + * [EMAIL PROTECTED] #registerMBean(Object mbean, ObjectName objectName)}. + */ + public + void preDeregister() { + getLogger().debug("preDeregister called."); + + Enumeration iterator = mbeanList.elements(); + while (iterator.hasMoreElements()) { + ObjectName name = (ObjectName) iterator.nextElement(); + try { + server.unregisterMBean(name); + } catch (InstanceNotFoundException e) { + getLogger().warn("Missing MBean " + name.getCanonicalName()); + } catch (MBeanRegistrationException e) { + getLogger().warn("Failed unregistering " + name.getCanonicalName()); + } + } + } } Modified: logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AppenderDynamicMBean.java URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AppenderDynamicMBean.java?rev=686131&r1=686130&r2=686131&view=diff ============================================================================== --- logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AppenderDynamicMBean.java (original) +++ logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/AppenderDynamicMBean.java Thu Aug 14 20:31:30 2008 @@ -199,7 +199,7 @@ LayoutDynamicMBean appenderMBean = new LayoutDynamicMBean(layout); objectName = new ObjectName("log4j:appender="+name); if (!server.isRegistered(objectName)) { - server.registerMBean(appenderMBean, objectName); + registerMBean(appenderMBean, objectName); dAttributes.add(new MBeanAttributeInfo("appender=" + name, "javax.management.ObjectName", "The " + name + " layout.", true, true, false)); } Modified: logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java?rev=686131&r1=686130&r2=686131&view=diff ============================================================================== --- logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java (original) +++ logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/HierarchyDynamicMBean.java Thu Aug 14 20:31:30 2008 @@ -122,7 +122,7 @@ objectName = new ObjectName("log4j", "logger", name); if (!server.isRegistered(objectName)) { - server.registerMBean(loggerMBean, objectName); + registerMBean(loggerMBean, objectName); NotificationFilterSupport nfs = new NotificationFilterSupport(); nfs.enableType(ADD_APPENDER + logger.getName()); log.debug("---Adding logger [" + name + "] as listener."); Modified: logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/LoggerDynamicMBean.java URL: http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/LoggerDynamicMBean.java?rev=686131&r1=686130&r2=686131&view=diff ============================================================================== --- logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/LoggerDynamicMBean.java (original) +++ logging/log4j/trunk/src/main/java/org/apache/log4j/jmx/LoggerDynamicMBean.java Thu Aug 14 20:31:30 2008 @@ -262,7 +262,7 @@ AppenderDynamicMBean appenderMBean = new AppenderDynamicMBean(appender); objectName = new ObjectName("log4j", "appender", name); if (!server.isRegistered(objectName)) { - server.registerMBean(appenderMBean, objectName); + registerMBean(appenderMBean, objectName); dAttributes.add(new MBeanAttributeInfo("appender=" + name, "javax.management.ObjectName", "The " + name + " appender.", true, true, false)); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]