Java JMX FAQ: Can you share a simple Java JMX example?
Here is some sample Java source code for some JMX tests that I created recently. I got a large percentage of this code from Sun's JMX MBean tutorial when I first started working with JMX, and I think it's some decent "Hello World" starter code. The main thing I've done here is (a) clarify what they've written and (b) added a shell script to start the JMX application. (I'm also about to publish some other JMX source code that I know I wrote myself.)
Our JMX MBean interface
First, here's the source code for a Java MBean interface named HelloMBean
:
public interface HelloMBean { public void setMessage(String message); public String getMessage(); public void sayHello(); }
A class to implement the JMX MBean interface
Next, here's the source code for a Java class named Hello
that implements the HelloMBean
interface we just defined:
public class Hello implements HelloMBean { private String message = null; public Hello() { message = "Hello, world"; } public Hello(String message) { this.message = message; } public void setMessage(String message) { this.message = message; } public String getMessage() { return message; } public void sayHello() { System.out.println(message); } }
A JMX example class (a JMX service)
Next up, here's the source code for a Java class named SimpleAgent
that includes a main
method that starts up our JMX service application:
import javax.management.*; import java.lang.management.*; public class SimpleAgent { private MBeanServer mbs = null; public SimpleAgent() { // Get the platform MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); // Unique identification of MBeans Hello helloBean = new Hello(); ObjectName helloName = null; try { // Uniquely identify the MBeans and register them with the platform MBeanServer helloName = new ObjectName("FOO:name=HelloBean"); mbs.registerMBean(helloBean, helloName); } catch(Exception e) { e.printStackTrace(); } } // Utility method: so that the application continues to run private static void waitForEnterPressed() { try { System.out.println("Press to continue..."); System.in.read(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String argv[]) { SimpleAgent agent = new SimpleAgent(); System.out.println("SimpleAgent is running..."); SimpleAgent.waitForEnterPressed(); } }
A script to start our JMX service
And finally here's a Unix/Linux shell script named run.sh
that I wrote to run this sample JMX application ("JMX service"):
#!/bin/sh java -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=1617 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ SimpleAgent
As you can see from that code, my application will listen on port 1617 of whatever computer system it is run on.
To run all of this code, save the source code shown here to the appropriate files (HelloMBean.java
, Hello.java
, and SimpleAgent.java
, and run.sh
), compile them, and then run them with the run.sh
script.
Access the JMX service with JConsole
Once the application is running you can then connect to it with the jconsole application and view its JMX resources. I don't have any JConsole screenshots here at this time, but in short, JConsole is a GUI application that Sun ships with the latest SDK releases. If you have the SDK, you should also have an application named jconsole, and you use jconsole as a "JMX console" to connect to both local and remote JMX services.
Assuming that my JMX example application is running on port 1617 (as shown in the script above) and on some remote server, you can access this JMX service via jconsole by (a) specifying the IP address of the server this service is running on and (b) that port. No password is needed to access this JMX service.