Given that Groovy sits directly on top of Java, Groovy can leverage the tremendous amount of work already done for JMX with Java. In addition, Groovy provides a
GroovyMBean class which makes an MBean look like a normal Groovy object. This simplifies Groovy code for interacting with MBeans. For example, the following code:
can be simplified to:
The remainder of this page shows you how to:
- Monitor the JVM using MXBeans
- Monitor Tomcat and display statistics
- Leverage Spring's MBean annotation support to export your Groovy beans as MBeans
Note: many of the examples on this page use Java 5 which incorporates JMX 1.2 (more recent versions if JMX or Java will also work). In some cases, you can run some of these examples using Java 1.4 by including a version of JMX on your CLASSPATH. MX4J is bundled with the full distribution of Groovy. In most cases, you can delete this jar from your distribution
lib directory if you are running with Java 5 or above.
Monitoring the JVM
MBeans are not accessed directly by an application but are managed by a repository called an MBean server. Java 5 and above includes a special MBean server called the platform MBean server, which is built into the JVM. Platform MBeans are registered in this server using unique names.
You can monitor the JVM through its platform MBeans with the following code:
When run, you will see something like this:
First start up Tomcat with JMX monitoring enabled by setting the following:
You can do this in your startup script and may choose any available port - we used 9004.
The following code uses JMX to discover the available MBeans in the running Tomcat, determine which are web modules, extract the processing time for each web module and displays the result in a graph using JFreeChart:
When run, we will see a trace of progress being made:
The output will look like this:
You can also use Spring to automatically register beans as JMX aware.
Here is an example class (Calculator.groovy):
Here is the Spring configuration file (beans.xml):
Here is a script which uses this bean and configuration:
And here is the resulting output:
You can even attach to the process while it is running with jconsole. It will look something like:
We started the Groovy application with the
-Dcom.sun.management.jmxremote JVM argument using a Java 5 JVM.
See also: Leveraging Spring