Search code examples
tomcattomcat7jmx

Is it possible to enable JMX in embedded Tomcat 7?


I would like to access Server and Connectors from within my webapp. Furthermore, I need to launch this webapp from embedded Tomcat. Here is how I boot tomcat:

Tomcat tomcat = new Tomcat();
tomcat.setPort(port);
StandardServer server = (StandardServer) tomcat.getServer();
server.addLifecycleListener(new AprLifecycleListener());
tomcat.addWebapp("/", webapp.getAbsolutePath());
tomcat.start();
tomcat.getServer().await();

When I use the typical example for accessing the Server via JMX1:

import javax.management.*;
import org.apache.catalina.Server;

MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
ObjectName name = new ObjectName("Catalina", "type", "Server");
Server server = (Server) mBeanServer.getAttribute(name, "managedResource");

I get:

Caused by: javax.management.InstanceNotFoundException: Catalina:type=Server
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1094)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:662)
at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:638)

I assume this is because I am failing to bootstrap JMX somehow.


Solution

  • Looks like JMX is running fine, it's the name I used for lookup that is the problem. Should have been:

    ObjectName name = new ObjectName("Tomcat", "type", "Server");
    

    instead.