Author: markt Date: Tue Feb 8 14:30:17 2011 New Revision: 1068416 URL: http://svn.apache.org/viewvc?rev=1068416&view=rev Log: Make NamingResources implement MBeanLifecycle Environments, Resources and ResourceLinks are once again available via JMX
Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/trunk/java/org/apache/catalina/core/StandardServer.java tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1068416&r1=1068415&r2=1068416&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Tue Feb 8 14:30:17 2011 @@ -122,6 +122,8 @@ standardContext.loginConfig.loginWarning standardContext.loginConfig.required=LoginConfig cannot be null standardContext.manager=Configured a manager of class [{0}] standardContext.mappingError=MAPPING configuration error for relative URI {0} +standardContext.namingResource.init.fail=Failed to init new naming resources +standardContext.namingResource.destroy.fail=Failed to destroy old naming resources standardContext.noResourceJar=Resource JARs are not supported. The JAR found at [{0}] will not be used to provide static content for context with name [{1}] standardContext.notFound=The requested resource ({0}) is not available. standardContext.notReloadable=Reloading is disabled on this Context Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1068416&r1=1068415&r2=1068416&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Tue Feb 8 14:30:17 2011 @@ -448,7 +448,6 @@ public class StandardContext extends Con * The naming resources for this web application. */ private NamingResources namingResources = null; - private ObjectName onameNamingResources; /** * The message destinations for this web application. @@ -1934,16 +1933,29 @@ public class StandardContext extends Con // Process the property setting change NamingResources oldNamingResources = this.namingResources; this.namingResources = namingResources; - namingResources.setContainer(this); + if (namingResources != null) { + namingResources.setContainer(this); + } support.firePropertyChange("namingResources", oldNamingResources, this.namingResources); // If set from server.xml, getObjectKeyPropertiesNameOnly() will // trigger an NPE. Initial registration takes place on INIT. if (getState() != LifecycleState.NEW) { - unregister(onameNamingResources); - onameNamingResources = register(namingResources, - "type=NamingResources," + getObjectKeyPropertiesNameOnly()); + if (oldNamingResources != null) { + try { + oldNamingResources.destroy(); + } catch (LifecycleException e) { + log.warn("standardContext.namingResource.destroy.fail", e); + } + } + if (namingResources != null) { + try { + namingResources.init(); + } catch (LifecycleException e) { + log.warn("standardContext.namingResource.init.fail", e); + } + } } } @@ -5435,7 +5447,9 @@ public class StandardContext extends Con sequenceNumber.getAndIncrement()); broadcaster.sendNotification(notification); - unregister(onameNamingResources); + if (namingResources != null) { + namingResources.destroy(); + } synchronized (instanceListenersLock) { instanceListeners = new String[0]; @@ -6087,8 +6101,7 @@ public class StandardContext extends Con // Register the naming resources if (namingResources != null) { - onameNamingResources = register(namingResources, - "type=NamingResources," + getObjectNameKeyProperties()); + namingResources.init(); } // Send j2ee.object.created notification Modified: tomcat/trunk/java/org/apache/catalina/core/StandardServer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardServer.java?rev=1068416&r1=1068415&r2=1068416&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardServer.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardServer.java Tue Feb 8 14:30:17 2011 @@ -718,6 +718,8 @@ public final class StandardServer extend fireLifecycleEvent(CONFIGURE_START_EVENT, null); setState(LifecycleState.STARTING); + globalNamingResources.start(); + // Start our defined Services synchronized (services) { for (int i = 0; i < services.length; i++) { @@ -745,8 +747,9 @@ public final class StandardServer extend services[i].stop(); } + globalNamingResources.stop(); + stopAwait(); - } /** @@ -770,8 +773,7 @@ public final class StandardServer extend onameMBeanFactory = register(factory, "type=MBeanFactory"); // Register the naming resources - onameNamingResoucres = register(globalNamingResources, - "type=NamingResources"); + globalNamingResources.init(); // Initialize our defined Services for (int i = 0; i < services.length; i++) { @@ -786,12 +788,12 @@ public final class StandardServer extend services[i].destroy(); } + globalNamingResources.destroy(); + unregister(onameMBeanFactory); unregister(onameStringCache); - - unregister(onameNamingResoucres); - + super.destroyInternal(); } @@ -824,7 +826,6 @@ public final class StandardServer extend private ObjectName onameStringCache; private ObjectName onameMBeanFactory; - private ObjectName onameNamingResoucres; /** * Obtain the MBean domain for this server. The domain is obtained using Modified: tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties?rev=1068416&r1=1068415&r2=1068416&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/deploy/LocalStrings.properties Tue Feb 8 14:30:17 2011 @@ -42,3 +42,7 @@ webXml.multipleOther=Multiple others ent webxml.unrecognisedPublicId=The public ID [{0}] did not match any of the known public ID's for web.xml files so the version could not be identified webXml.version.nfe=Unable to parse [{0}] from the version string [{1}]. This component of the version string will be ignored. webXml.wrongFragmentName=Used a wrong fragment name {0} at web.xml absolute-ordering tag! + +namingResources.mbeanCreateFail=Failed to create MBean for naming resource [{0}] +namingResoucres.mbeanDestroyFail=Failed to destroy MBean for naming resource [{1}] + Modified: tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java?rev=1068416&r1=1068415&r2=1068416&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java (original) +++ tomcat/trunk/java/org/apache/catalina/deploy/NamingResources.java Tue Feb 8 14:30:17 2011 @@ -25,9 +25,17 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Hashtable; +import org.apache.catalina.Container; import org.apache.catalina.Context; import org.apache.catalina.Engine; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.LifecycleState; import org.apache.catalina.Server; +import org.apache.catalina.mbeans.MBeanUtils; +import org.apache.catalina.util.LifecycleMBeanBase; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.util.res.StringManager; /** @@ -38,9 +46,16 @@ import org.apache.catalina.Server; * @version $Id$ */ -public class NamingResources implements Serializable { +public class NamingResources extends LifecycleMBeanBase implements Serializable { private static final long serialVersionUID = 1L; + + private static final Log log = LogFactory.getLog(NamingResources.class); + + private static final StringManager sm = + StringManager.getManager(Constants.Package); + + private volatile boolean resourceRequireExplicitRegistration = false; // ----------------------------------------------------------- Constructors @@ -238,6 +253,15 @@ public class NamingResources implements } support.firePropertyChange("environment", null, environment); + // Register with JMX + if (resourceRequireExplicitRegistration) { + try { + MBeanUtils.createMBean(environment); + } catch (Exception e) { + log.warn(sm.getString("namingResources.mbeanCreateFail", + environment.getName()), e); + } + } } // Container should be an instance of Server or Context. If it is anything @@ -330,6 +354,15 @@ public class NamingResources implements } support.firePropertyChange("resource", null, resource); + // Register with JMX + if (resourceRequireExplicitRegistration) { + try { + MBeanUtils.createMBean(resource); + } catch (Exception e) { + log.warn(sm.getString("namingResources.mbeanCreateFail", + resource.getName()), e); + } + } } @@ -378,6 +411,15 @@ public class NamingResources implements } support.firePropertyChange("resourceLink", null, resourceLink); + // Register with JMX + if (resourceRequireExplicitRegistration) { + try { + MBeanUtils.createMBean(resourceLink); + } catch (Exception e) { + log.warn(sm.getString("namingResources.mbeanCreateFail", + resourceLink.getName()), e); + } + } } @@ -689,9 +731,17 @@ public class NamingResources implements } if (environment != null) { support.firePropertyChange("environment", environment, null); + // De-register with JMX + if (resourceRequireExplicitRegistration) { + try { + MBeanUtils.destroyMBean(environment); + } catch (Exception e) { + log.warn(sm.getString("namingResources.mbeanDestroyFail", + environment.getName()), e); + } + } environment.setNamingResources(null); } - } @@ -765,9 +815,17 @@ public class NamingResources implements } if (resource != null) { support.firePropertyChange("resource", resource, null); + // De-register with JMX + if (resourceRequireExplicitRegistration) { + try { + MBeanUtils.destroyMBean(resource); + } catch (Exception e) { + log.warn(sm.getString("namingResources.mbeanDestroyFail", + resource.getName()), e); + } + } resource.setNamingResources(null); } - } @@ -808,9 +866,17 @@ public class NamingResources implements } if (resourceLink != null) { support.firePropertyChange("resourceLink", resourceLink, null); + // De-register with JMX + if (resourceRequireExplicitRegistration) { + try { + MBeanUtils.destroyMBean(resourceLink); + } catch (Exception e) { + log.warn(sm.getString("namingResources.mbeanDestroyFail", + resourceLink.getName()), e); + } + } resourceLink.setNamingResources(null); } - } @@ -835,4 +901,119 @@ public class NamingResources implements } + // ------------------------------------------------------- Lifecycle methods + + @Override + protected void initInternal() throws LifecycleException { + super.initInternal(); + + // Set this before we register currently known naming resources to avoid + // timing issues. Duplication registration is not an issue. + resourceRequireExplicitRegistration = true; + + for (ContextResource cr : resources.values()) { + try { + MBeanUtils.createMBean(cr); + } catch (Exception e) { + log.warn(sm.getString( + "namingResources.mbeanCreateFail", cr.getName()), e); + } + } + + for (ContextEnvironment ce : envs.values()) { + try { + MBeanUtils.createMBean(ce); + } catch (Exception e) { + log.warn(sm.getString( + "namingResources.mbeanCreateFail", ce.getName()), e); + } + } + + for (ContextResourceLink crl : resourceLinks.values()) { + try { + MBeanUtils.createMBean(crl); + } catch (Exception e) { + log.warn(sm.getString( + "namingResources.mbeanCreateFail", crl.getName()), e); + } + } + } + + + @Override + protected void startInternal() throws LifecycleException { + fireLifecycleEvent(CONFIGURE_START_EVENT, null); + setState(LifecycleState.STARTING); + } + + + @Override + protected void stopInternal() throws LifecycleException { + setState(LifecycleState.STOPPING); + fireLifecycleEvent(CONFIGURE_STOP_EVENT, null); + } + + + @Override + protected void destroyInternal() throws LifecycleException { + + // Set this before we de-register currently known naming resources to + // avoid timing issues. Duplication de-registration is not an issue. + resourceRequireExplicitRegistration = false; + + // Destroy in reverse order to create, although it should not matter + for (ContextResourceLink crl : resourceLinks.values()) { + try { + MBeanUtils.destroyMBean(crl); + } catch (Exception e) { + log.warn(sm.getString( + "namingResources.mbeanDestroyFail", crl.getName()), e); + } + } + + for (ContextEnvironment ce : envs.values()) { + try { + MBeanUtils.destroyMBean(ce); + } catch (Exception e) { + log.warn(sm.getString( + "namingResources.mbeanDestroyFail", ce.getName()), e); + } + } + + for (ContextResource cr : resources.values()) { + try { + MBeanUtils.destroyMBean(cr); + } catch (Exception e) { + log.warn(sm.getString( + "namingResources.mbeanDestroyFail", cr.getName()), e); + } + } + + super.destroyInternal(); + } + + + @Override + protected String getDomainInternal() { + // Use the same domain as our associated container if we have one + Object c = getContainer(); + + if (c instanceof LifecycleMBeanBase) { + return ((LifecycleMBeanBase) c).getDomain(); + } + + return null; + } + + + @Override + protected String getObjectNameKeyProperties() { + Object c = getContainer(); + if (c instanceof Container) { + return "type=NamingResources" + + MBeanUtils.getContainerKeyProperties((Container) c); + } + // Server or just unknown + return "type=NamingResources"; + } } Modified: tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java?rev=1068416&r1=1068415&r2=1068416&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java (original) +++ tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java Tue Feb 8 14:30:17 2011 @@ -136,7 +136,7 @@ public class MBeanUtils { * * @exception Exception if an MBean cannot be created or registered */ - static DynamicMBean createMBean(ContextEnvironment environment) + public static DynamicMBean createMBean(ContextEnvironment environment) throws Exception { String mname = createManagedName(environment); @@ -167,7 +167,7 @@ public class MBeanUtils { * * @exception Exception if an MBean cannot be created or registered */ - static DynamicMBean createMBean(ContextResource resource) + public static DynamicMBean createMBean(ContextResource resource) throws Exception { String mname = createManagedName(resource); @@ -198,7 +198,7 @@ public class MBeanUtils { * * @exception Exception if an MBean cannot be created or registered */ - static DynamicMBean createMBean(ContextResourceLink resourceLink) + public static DynamicMBean createMBean(ContextResourceLink resourceLink) throws Exception { String mname = createManagedName(resourceLink); @@ -1026,7 +1026,7 @@ public class MBeanUtils { if (registry == null) { registry = Registry.getRegistry(null, null); - ClassLoader cl=ServerLifecycleListener.class.getClassLoader(); + ClassLoader cl = MBeanUtils.class.getClassLoader(); registry.loadDescriptors("org.apache.catalina.mbeans", cl); registry.loadDescriptors("org.apache.catalina.authenticator", cl); @@ -1140,7 +1140,7 @@ public class MBeanUtils { * * @exception Exception if an MBean cannot be deregistered */ - static void destroyMBean(ContextEnvironment environment) + public static void destroyMBean(ContextEnvironment environment) throws Exception { String mname = createManagedName(environment); @@ -1166,7 +1166,7 @@ public class MBeanUtils { * * @exception Exception if an MBean cannot be deregistered */ - static void destroyMBean(ContextResource resource) + public static void destroyMBean(ContextResource resource) throws Exception { // If this is a user database resource need to destroy groups, roles, @@ -1198,7 +1198,7 @@ public class MBeanUtils { * * @exception Exception if an MBean cannot be deregistered */ - static void destroyMBean(ContextResourceLink resourceLink) + public static void destroyMBean(ContextResourceLink resourceLink) throws Exception { String mname = createManagedName(resourceLink); Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1068416&r1=1068415&r2=1068416&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Tue Feb 8 14:30:17 2011 @@ -60,6 +60,10 @@ address, remote host, protocol and server port may be used in an access log if desired. (markt) </add> + <fix> + Restore access to Environments, Resources and ResourceLinks via JMX + which was lost in early 7.0.x re-factoring. (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org