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 2009/04/30 00:47:53 UTC
svn commit: r769979 - in /tomcat/trunk/java/org/apache/catalina:
connector/MapperListener.java mbeans/MBeanUtils.java
mbeans/ServerLifecycleListener.java
Author: markt
Date: Wed Apr 29 22:47:53 2009
New Revision: 769979
URL: http://svn.apache.org/viewvc?rev=769979&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47046
Unregister all MBeans, including when non-default engine names are used (which changes the domain of some of the MBeans)
Modified:
tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java
tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java
tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java
Modified: tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java?rev=769979&r1=769978&r2=769979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/MapperListener.java Wed Apr 29 22:47:53 2009
@@ -353,7 +353,9 @@
domain).getContainer().findChild(name);
mapper.removeHost(name);
- host.removeContainerListener(this);
+ if (host != null) {
+ host.removeContainerListener(this);
+ }
if(log.isDebugEnabled())
log.debug(sm.getString
("mapperListener.unregisterHost", name, domain));
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=769979&r1=769978&r2=769979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java (original)
+++ tomcat/trunk/java/org/apache/catalina/mbeans/MBeanUtils.java Wed Apr 29 22:47:53 2009
@@ -19,6 +19,7 @@
import java.util.Hashtable;
+import java.util.Set;
import javax.management.DynamicMBean;
import javax.management.MBeanException;
@@ -47,6 +48,12 @@
import org.apache.catalina.deploy.ContextResourceLink;
import org.apache.catalina.deploy.NamingResources;
import org.apache.catalina.valves.ValveBase;
+import org.apache.coyote.ProtocolHandler;
+import org.apache.coyote.ajp.AjpAprProtocol;
+import org.apache.coyote.ajp.AjpProtocol;
+import org.apache.coyote.http11.Http11AprProtocol;
+import org.apache.coyote.http11.Http11NioProtocol;
+import org.apache.coyote.http11.Http11Protocol;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.IntrospectionUtils;
@@ -734,29 +741,23 @@
throws MalformedObjectNameException {
ObjectName name = null;
- if (connector.getClass().getName().indexOf("CoyoteConnector") >= 0 ) {
- try {
- String address = (String)
- IntrospectionUtils.getProperty(connector, "address");
- Integer port = (Integer)
- IntrospectionUtils.getProperty(connector, "port");
- StringBuffer sb = new StringBuffer(domain);
- sb.append(":type=Connector");
- sb.append(",port=" + port);
- if ((address != null) && (address.length()>0)) {
- sb.append(",address=" + address);
- }
- name = new ObjectName(sb.toString());
- return (name);
- } catch (Exception e) {
- throw new MalformedObjectNameException
- ("Cannot create object name for " + connector+e);
+ try {
+ String address = (String)
+ IntrospectionUtils.getProperty(connector, "address");
+ Integer port = (Integer)
+ IntrospectionUtils.getProperty(connector, "port");
+ StringBuffer sb = new StringBuffer(domain);
+ sb.append(":type=Connector");
+ sb.append(",port=" + port);
+ if ((address != null) && (address.length()>0)) {
+ sb.append(",address=" + address);
}
- } else {
+ name = new ObjectName(sb.toString());
+ return (name);
+ } catch (Exception e) {
throw new MalformedObjectNameException
- ("Cannot create object name for " + connector);
+ ("Cannot create object name for " + connector+e);
}
-
}
@@ -1373,13 +1374,8 @@
static void destroyMBean(Connector connector, Service service)
throws Exception {
- connector.setService(service);
- String mname = createManagedName(connector);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ // domain is engine name
+ String domain = service.getContainer().getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, connector);
@@ -1387,6 +1383,26 @@
if( mserver.isRegistered( oname )) {
mserver.unregisterMBean(oname);
}
+ // Unregister associated request processor
+ String worker = null;
+ ProtocolHandler handler = connector.getProtocolHandler();
+ if (handler instanceof Http11Protocol) {
+ worker = ((Http11Protocol)handler).getName();
+ } else if (handler instanceof Http11NioProtocol) {
+ worker = ((Http11NioProtocol)handler).getName();
+ } else if (handler instanceof Http11AprProtocol) {
+ worker = ((Http11AprProtocol)handler).getName();
+ } else if (handler instanceof AjpProtocol) {
+ worker = ((AjpProtocol)handler).getName();
+ } else if (handler instanceof AjpAprProtocol) {
+ worker = ((AjpAprProtocol)handler).getName();
+ }
+ ObjectName query = new ObjectName(
+ domain + ":type=RequestProcessor,worker=" + worker + ",*");
+ Set<ObjectName> results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
}
@@ -1401,12 +1417,7 @@
static void destroyMBean(Context context)
throws Exception {
- String mname = createManagedName(context);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ String domain = context.getParent().getParent().getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, context);
@@ -1453,6 +1464,12 @@
static void destroyMBean(ContextResource resource)
throws Exception {
+ // If this is a user database resource need to destroy groups, roles,
+ // users and UserDatabase mbean
+ if ("org.apache.catalina.UserDatabase".equals(resource.getType())) {
+ destroyMBeanUserDatabase(resource.getName());
+ }
+
String mname = createManagedName(resource);
ManagedBean managed = registry.findManagedBean(mname);
if (managed == null) {
@@ -1503,13 +1520,7 @@
*/
static void destroyMBean(Engine engine)
throws Exception {
-
- String mname = createManagedName(engine);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ String domain = engine.getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, engine);
@@ -1556,12 +1567,7 @@
static void destroyMBean(Host host)
throws Exception {
- String mname = createManagedName(host);
- ManagedBean managed = registry.findManagedBean(mname);
- if (managed == null) {
- return;
- }
- String domain = managed.getDomain();
+ String domain = host.getParent().getName();
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, host);
@@ -1643,7 +1649,7 @@
if (domain == null)
domain = mserver.getDefaultDomain();
ObjectName oname = createObjectName(domain, resources);
- if( mserver.isRegistered(oname) )
+ if( mserver.isRegistered(oname) )
mserver.unregisterMBean(oname);
}
@@ -1723,6 +1729,16 @@
ObjectName oname = createObjectName(domain, server);
if( mserver.isRegistered(oname) )
mserver.unregisterMBean(oname);
+
+ // Global String cache - fixed name
+ oname = new ObjectName("Catalina:type=StringCache");
+ if( mserver.isRegistered(oname) )
+ mserver.unregisterMBean(oname);
+
+ // MBean Factory - fixed name
+ oname = new ObjectName("Catalina:type=MBeanFactory");
+ if( mserver.isRegistered(oname) )
+ mserver.unregisterMBean(oname);
}
@@ -1806,6 +1822,51 @@
/**
+ * Deregister the MBean for the
+ * <code>UserDatabase</code> object with this name.
+ *
+ * @param userDatabase The UserDatabase to be managed
+ *
+ * @exception Exception if an MBean cannot be deregistered
+ */
+ static void destroyMBeanUserDatabase(String userDatabase)
+ throws Exception {
+
+ ObjectName query = null;
+ Set<ObjectName> results = null;
+
+ // Groups
+ query = new ObjectName(
+ "Users:type=Group,database=" + userDatabase + ",*");
+ results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
+
+ // Roles
+ query = new ObjectName(
+ "Users:type=Role,database=" + userDatabase + ",*");
+ results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
+
+ // Users
+ query = new ObjectName(
+ "Users:type=User,database=" + userDatabase + ",*");
+ results = mserver.queryNames(query, null);
+ for(ObjectName result : results) {
+ mserver.unregisterMBean(result);
+ }
+
+ // The database itself
+ ObjectName db = new ObjectName(
+ "Users:type=UserDatabase,database=" + userDatabase);
+ mserver.unregisterMBean(db);
+ }
+
+
+ /**
* Deregister the MBean for this
* <code>Valve</code> object.
*
Modified: tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java?rev=769979&r1=769978&r2=769979&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java (original)
+++ tomcat/trunk/java/org/apache/catalina/mbeans/ServerLifecycleListener.java Wed Apr 29 22:47:53 2009
@@ -148,7 +148,7 @@
createMBeans();
*/
- } else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
+ } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
try {
if (lifecycle instanceof Server) {
destroyMBeans((Server)lifecycle);
@@ -590,10 +590,6 @@
*/
protected void createMBeans(Service service) throws Exception {
- // Create the MBean for the Service itself
- if (log.isDebugEnabled())
- log.debug("Creating MBean for Service " + service);
- //MBeanUtils.createMBean(service);
if (service instanceof StandardService) {
((StandardService) service).addPropertyChangeListener(this);
}
@@ -626,10 +622,10 @@
protected void destroyMBeans(Connector connector, Service service)
throws Exception {
-// // deregister the MBean for the Connector itself
-// if (log.isDebugEnabled())
-// log.debug("Destroying MBean for Connector " + connector);
-// MBeanUtils.destroyMBean(connector, service);
+ // deregister the MBean for the Connector itself
+ if (log.isDebugEnabled())
+ log.debug("Destroying MBean for Connector " + connector);
+ MBeanUtils.destroyMBean(connector, service);
}
@@ -677,7 +673,7 @@
// deregister the MBean for the Context itself
if (log.isDebugEnabled())
log.debug("Destroying MBean for Context " + context);
- //MBeanUtils.destroyMBean(context);
+ MBeanUtils.destroyMBean(context);
if (context instanceof StandardContext) {
((StandardContext) context).
removePropertyChangeListener(this);
@@ -774,7 +770,7 @@
if (log.isDebugEnabled()) {
log.debug("Destroying MBean for Engine " + engine);
}
- //MBeanUtils.destroyMBean(engine);
+ MBeanUtils.destroyMBean(engine);
}
@@ -811,7 +807,7 @@
if (log.isDebugEnabled()) {
log.debug("Destroying MBean for Host " + host);
}
- //MBeanUtils.destroyMBean(host);
+ MBeanUtils.destroyMBean(host);
}
@@ -880,7 +876,7 @@
if (log.isDebugEnabled()) {
log.debug("Destroying MBean for Server " + server);
}
- //MBeanUtils.destroyMBean(server);
+ MBeanUtils.destroyMBean(server);
if (server instanceof StandardServer) {
((StandardServer) server).removePropertyChangeListener(this);
}
@@ -901,20 +897,15 @@
// Deregister the MBeans for the associated Engine
Engine engine = (Engine) service.getContainer();
if (engine != null) {
- //destroyMBeans(engine);
+ destroyMBeans(engine);
}
-// // Deregister the MBeans for the corresponding Connectors
-// Connector connectors[] = service.findConnectors();
-// for (int j = 0; j < connectors.length; j++) {
-// destroyMBeans(connectors[j], service);
-// }
-
- // Deregister the MBean for the Service itself
- if (log.isDebugEnabled()) {
- log.debug("Destroying MBean for Service " + service);
+ // Deregister the MBeans for the corresponding Connectors
+ Connector connectors[] = service.findConnectors();
+ for (int j = 0; j < connectors.length; j++) {
+ destroyMBeans(connectors[j], service);
}
- //MBeanUtils.destroyMBean(service);
+
if (service instanceof StandardService) {
((StandardService) service).removePropertyChangeListener(this);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org