You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/05/02 19:36:38 UTC

svn commit: r940273 - in /tomcat/trunk: java/org/apache/catalina/ java/org/apache/catalina/core/ test/org/apache/catalina/mbeans/

Author: markt
Date: Sun May  2 17:36:38 2010
New Revision: 940273

URL: http://svn.apache.org/viewvc?rev=940273&view=rev
Log:
Add new interface to StandardServer to enable MBean (de)registration on init/destroy

Added:
    tomcat/trunk/test/org/apache/catalina/mbeans/
    tomcat/trunk/test/org/apache/catalina/mbeans/RegistrationTest.java   (with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/Globals.java
    tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/core/StandardServer.java

Modified: tomcat/trunk/java/org/apache/catalina/Globals.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Globals.java?rev=940273&r1=940272&r2=940273&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Globals.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Globals.java Sun May  2 17:36:38 2010
@@ -334,4 +334,9 @@ public final class Globals {
     public static final String ASYNC_SUPPORTED_ATTR = 
         "org.apache.catalina.ASYNC_SUPPORTED";
 
+    
+    /**
+     * Default domain for MBeans if none can be determined
+     */
+    public static final String DEFAULT_MBEAN_DOMAIN = "Catalina";
 }

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=940273&r1=940272&r2=940273&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Sun May  2 17:36:38 2010
@@ -188,6 +188,7 @@ standardHost.warRequired=URL to web appl
 standardHost.warURL=Invalid URL for web application archive: {0}
 standardHost.validationEnabled=XML validation enabled
 standardHost.validationDisabled=XML validation disabled
+standardServer.onameFail=MBean name specified for Server [{0}] is not valid
 standardServer.shutdownViaPort=A valid shutdown command was received via the shutdown port. Stopping the Server instance.
 standardService.connector.failed=Failed to start connector [{0}]
 standardService.initialize.failed=Service initializing at {0} failed

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=940273&r1=940272&r2=940273&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardServer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardServer.java Sun May  2 17:36:38 2010
@@ -29,12 +29,15 @@ import java.net.Socket;
 import java.security.AccessControlException;
 import java.util.Random;
 
-import javax.management.MBeanRegistration;
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
+import org.apache.catalina.Container;
 import org.apache.catalina.Context;
+import org.apache.catalina.Globals;
 import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleMBeanRegistration;
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.Server;
 import org.apache.catalina.Service;
@@ -47,6 +50,8 @@ import org.apache.juli.logging.LogFactor
 import org.apache.tomcat.util.buf.StringCache;
 import org.apache.tomcat.util.modeler.Registry;
 
+import com.sun.xml.internal.ws.api.pipe.Engine;
+
 
 
 /**
@@ -57,7 +62,7 @@ import org.apache.tomcat.util.modeler.Re
  * @version $Id$
  */
 public final class StandardServer extends LifecycleBase
-        implements Server, MBeanRegistration {
+        implements Server, LifecycleMBeanRegistration {
 
     private static final Log log = LogFactory.getLog(StandardServer.class);
    
@@ -682,17 +687,10 @@ public final class StandardServer extend
     @Override
     protected void initInternal() throws LifecycleException {
 
-        if( oname==null ) {
-            try {
-                oname=new ObjectName( "Catalina:type=Server");
-                Registry.getRegistry(null, null)
-                    .registerComponent(this, oname, null );
-            } catch (Exception e) {
-                log.error("Error registering ",e);
-            }
-        }
-        
         // Register global String cache
+        // Note although the cache is global, if there are multiple Servers
+        // present in the JVM (may happen when embedding) then the same cache
+        // will be registered under multiple names
         try {
             ObjectName oname2 = 
                 new ObjectName(oname.getDomain() + ":type=StringCache");
@@ -708,39 +706,82 @@ public final class StandardServer extend
         }
     }
     
+    @Override
     protected void destroyInternal() {
         // NOOP
     }
 
-    protected String type;
-    protected String domain;
-    protected String suffix;
-    protected ObjectName oname;
+    protected volatile String domain;
+    protected volatile ObjectName oname;
     protected MBeanServer mserver;
 
+    /**
+     * Obtain the MBean domain for this server. The domain is obtained using
+     * the following search order:
+     * <ol>
+     * <li>Name of first {@link Engine}.</li>
+     * <li>Name of first {@link Service}.</li>
+     * <li>Global default defined by {@link Globals#DEFAULT_MBEAN_DOMAIN}</li>
+     * </ol>
+     */
+    public String getDomain() {
+        if (domain == null) {
+            Service[] services = findServices();
+            if (services.length > 0) {
+                Service service = services[0];
+                if (service != null) {
+                    Container container = service.getContainer();
+                    if (container != null) {
+                        domain = container.getName();
+                    } else {
+                        domain = service.getName();
+                    }
+                }
+            }
+            if (domain == null) {
+                domain = Globals.DEFAULT_MBEAN_DOMAIN;
+            }
+        }
+        return domain;
+    }
+
+    
     public ObjectName getObjectName() {
+        if (oname == null) {
+            StringBuilder name = new StringBuilder(getDomain());
+            name.append(":type=Server");
+            
+            try {
+                oname = new ObjectName(name.toString());
+            } catch (MalformedObjectNameException e) {
+                log.warn(sm.getString("standardServer.onameFail", name), e);
+            } catch (NullPointerException e) {
+                // Never going to happen
+            }
+        }
+        
         return oname;
     }
 
-    public String getDomain() {
-        return domain;
-    }
 
     public ObjectName preRegister(MBeanServer server,
                                   ObjectName name) throws Exception {
-        oname=name;
-        mserver=server;
-        domain=name.getDomain();
+        oname = name;
+        mserver = server;
+        domain = name.getDomain();
         return name;
     }
 
     public void postRegister(Boolean registrationDone) {
+        // NOOP
     }
 
     public void preDeregister() throws Exception {
+        // NOOP
     }
 
     public void postDeregister() {
+        // NOOP
     }
     
 }

Added: tomcat/trunk/test/org/apache/catalina/mbeans/RegistrationTest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/mbeans/RegistrationTest.java?rev=940273&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/mbeans/RegistrationTest.java (added)
+++ tomcat/trunk/test/org/apache/catalina/mbeans/RegistrationTest.java Sun May  2 17:36:38 2010
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.mbeans;
+
+import java.io.File;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.tomcat.util.modeler.Registry;
+
+/**
+ * General tests around the process of registration and de-registration that
+ * don't necessarily apply to one specific Tomcat class.
+ *
+ */
+public class RegistrationTest extends TomcatBaseTest {
+
+    /**
+     * Test verifying that Tomcat correctly de-registers the MBeans it has
+     * registered.
+     * @author Marc Guillemot
+     */
+	public void testMBeanDeregistration() throws Exception {
+		final MBeanServer mbeanServer = Registry.getRegistry(null, null).getMBeanServer();
+        Set<ObjectName> onames = mbeanServer.queryNames(new ObjectName("Catalina:*"), null);
+        assertEquals("Remaining: " + onames, 0, onames.size());
+
+        final Tomcat tomcat = getTomcatInstance();
+        // need to register a ServerLifecycleListener otherwise only a few MBeans are registered 
+        tomcat.getServer().addLifecycleListener(new ServerLifecycleListener());
+        final File contextDir = new File("output/webappFoo");
+        contextDir.mkdir();
+        tomcat.addContext("/foo", contextDir.getAbsolutePath());
+        tomcat.start();
+        
+        // Verify there are no Catalina MBeans
+        onames = mbeanServer.queryNames(new ObjectName("Catalina:*"), null);
+        assertEquals("Found: " + onames, 0, onames.size());
+
+        // Verify there are some Tomcat MBeans
+        onames = mbeanServer.queryNames(new ObjectName("Tomcat:*"), null);
+        assertTrue("No Tomcat MBeans", onames.size() > 0);
+
+        tomcat.stop();
+
+        // Verify there are no Tomcat MBeans
+        onames = mbeanServer.queryNames(new ObjectName("Catalina:*"), null);
+        assertEquals("Remaining: " + onames, 0, onames.size());
+
+        // add a new host
+        StandardHost host = new StandardHost();
+        host.setName("otherhost");
+        tomcat.getEngine().addChild(host);
+
+        final File contextDir2 = new File("output/webappFoo2");
+        contextDir2.mkdir();
+        tomcat.addContext(host, "/foo2", contextDir2.getAbsolutePath());
+        
+        tomcat.start();
+        tomcat.stop();
+
+        onames = mbeanServer.queryNames(new ObjectName("Catalina:*"), null);
+        assertEquals("Remaining: " + onames, 0, onames.size());
+	}
+	
+}

Propchange: tomcat/trunk/test/org/apache/catalina/mbeans/RegistrationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org