From 117513919827795d14dad350654ecb82d6389244 Mon Sep 17 00:00:00 2001 From: markt Date: Sun, 2 May 2010 18:47:56 +0000 Subject: [PATCH] Add LifecycleMBeanRegistration Align init() and destroy() Executors and Connectors need to handle their own (de)registration git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@940298 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/catalina/core/LocalStrings.properties | 4 +- java/org/apache/catalina/core/StandardService.java | 144 ++++++++++++--------- 2 files changed, 86 insertions(+), 62 deletions(-) diff --git a/java/org/apache/catalina/core/LocalStrings.properties b/java/org/apache/catalina/core/LocalStrings.properties index b8b5dbe41..644060e49 100644 --- a/java/org/apache/catalina/core/LocalStrings.properties +++ b/java/org/apache/catalina/core/LocalStrings.properties @@ -190,8 +190,10 @@ 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.connector.initFailed=Failed to initialise connector [{0}] +standardService.connector.destroyFailed=Failed to destroy connector [{0}] standardService.initialize.failed=Service initializing at {0} failed +standardService.onameFail=MBean name specified for Service [{0}] is not valid standardService.register.failed=Error registering Service at domain {0} standardService.start.name=Starting service {0} standardService.stop.name=Stopping service {0} diff --git a/java/org/apache/catalina/core/StandardService.java b/java/org/apache/catalina/core/StandardService.java index 42f3b03bd..b8a730817 100644 --- a/java/org/apache/catalina/core/StandardService.java +++ b/java/org/apache/catalina/core/StandardService.java @@ -21,13 +21,15 @@ package org.apache.catalina.core; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; -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.Engine; +import org.apache.catalina.Globals; import org.apache.catalina.Lifecycle; 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; @@ -50,7 +52,7 @@ import org.apache.catalina.Executor; */ public class StandardService extends LifecycleBase - implements Service, MBeanRegistration { + implements Service, LifecycleMBeanRegistration { private static final Log log = LogFactory.getLog(StandardService.class); @@ -503,19 +505,6 @@ public class StandardService extends LifecycleBase executors.get(i).stop(); } } - - - Registry.getRegistry(null, null).unregisterComponent(oname); - Executor[] executors = findExecutors(); - for (int i = 0; i < executors.length; i++) { - try { - ObjectName executorObjectName = - new ObjectName(domain + ":type=Executor,name=" + executors[i].getName()); - Registry.getRegistry(null, null).unregisterComponent(executorObjectName); - } catch (Exception e) { - // Ignore (invalid ON, which cannot happen) - } - } } @@ -526,84 +515,117 @@ public class StandardService extends LifecycleBase @Override protected void initInternal() throws LifecycleException { - if( oname==null ) { - try { - // Hack - Server should be deprecated... - Container engine=this.getContainer(); - domain = engine.getName(); - oname=new ObjectName(domain + ":type=Service"); - Registry.getRegistry(null, null) - .registerComponent(this, oname, null); - - Executor[] executors = findExecutors(); - for (int i = 0; i < executors.length; i++) { - ObjectName executorObjectName = - new ObjectName(domain + ":type=Executor,name=" + executors[i].getName()); - Registry.getRegistry(null, null) - .registerComponent(executors[i], executorObjectName, null); - } - - } catch (Exception e) { - log.error(sm.getString("standardService.register.failed",domain),e); - } - - + if (container != null) { + container.init(); } - if( server==null ) { - // If no server was defined - create one - server = new StandardServer(); - server.addService(this); + + // Initialize any Executors + for (Executor executor : findExecutors()) { + executor.init(); } - // Initialize our defined Connectors synchronized (connectors) { - for (int i = 0; i < connectors.length; i++) { - try { - connectors[i].init(); - } catch (Exception e) { - log.error(sm.getString( - "standardService.connector.failed", - connectors[i]), e); - } + for (Connector connector : connectors) { + try { + connector.init(); + } catch (Exception e) { + log.error(sm.getString( + "standardService.connector.initFailed", connector), + e); } + } } } @Override - protected void destroyInternal() { - // FIXME unregister should be here probably -- stop doing that ? - } + protected void destroyInternal() throws LifecycleException { + Registry.getRegistry(null, null).unregisterComponent(oname); + + // Destroy our defined Connectors + synchronized (connectors) { + for (Connector connector : connectors) { + try { + connector.destroy(); + } catch (Exception e) { + log.error(sm.getString( + "standardService.connector.destroyfailed", + connector), e); + } + } + } - protected String type; - protected String domain; - protected String suffix; - protected ObjectName oname; - protected MBeanServer mserver; + // Destroy any Executors + for (Executor executor : findExecutors()) { + executor.destroy(); + } + + if (container != null) { + container.destroy(); + } - public ObjectName getObjectName() { - return oname; } + protected volatile String domain; + protected volatile ObjectName oname; + + /** + * Obtain the MBean domain for this server. The domain is obtained using + * the following search order: + *
    + *
  1. Name of the {@link Engine}.
  2. + *
  3. Name of the {@link Service}.
  4. + *
  5. Global default defined by {@link Globals#DEFAULT_MBEAN_DOMAIN}
  6. + *
+ */ public String getDomain() { + if (domain == null) { + Container container = getContainer(); + if (container != null) { + domain = container.getName(); + } else { + domain = 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=Service"); + + try { + oname = new ObjectName(name.toString()); + } catch (MalformedObjectNameException e) { + log.warn(sm.getString("standardService.onameFail", name), e); + } catch (NullPointerException e) { + // Never going to happen + } + } + + return oname; + } public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { 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 } } -- 2.11.0