Over a million developers have joined DZone.

Java JMX Shutdown Gracefully with ShutdownHook example


For JMX you need an interface:

package com.bos.jmx;

public interface ShutdownMBean {
		 * Shutdown operation
	public void shutdown() throws Exception;

The implementation is Shutdown java class above.

Include this code on server startup used in my Main.java:

public void initServerJMX() throws MalformedObjectNameException,
       InstanceAlreadyExistsException, MBeanRegistrationException,
       NotCompliantMBeanException {
     // Initialise JMX
     // Get the Platform MBean Server
     MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

     // Construct the ObjectName for the Shutdown MBean we will register
     ObjectName mbeanName = new ObjectName("com.bos.jmx:type=Shutdown");

     // Create the Shutdown MBean
     final Shutdown mbean = new Shutdown();

     // Register the Hello World MBean
     mbs.registerMBean(mbean, mbeanName);
     Runtime.getRuntime().addShutdownHook(new Thread() {
       public void run() {
         try {
         } catch (Exception e) {

public void useArg0(String arg) {

//sample code using arg


Include this code in client used to shutdown the server used in my Main.java:

public void clientExecuteShutdown(int port) throws Exception {
	JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:"
						+ port + "/jmxrmi");
			JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
			MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
	// Construct the ObjectName for the Shutdown MBean
        ObjectName mbeanName = new ObjectName("com.bos.jmx:type=Shutdown");

        // Create a dedicated proxy for the MBean instead of
        // going directly through the MBean server connection
        ShutdownMBean mbeanProxy =
            JMX.newMBeanProxy(mbsc, mbeanName, ShutdownMBean.class, true);
        logger.info("Executing shutdown...");
        logger.info("Shutdown done.");

My sample start/shutdown code with main used in my Main.java:

public static void main(String args[]) throws NumberFormatException, Exception {

			if (args.length < 1) {
						throw new RuntimeException(
		"1. Please specify 1st argument."
									+ "\n2. Please specify 1st argument as shutdown and 2nd argument as port of JMX.");
			if ("shutdown".equalsIgnoreCase(args[0])) {
					if (args.length < 2) {
							throw new RuntimeException(
									"Please specify 1st argument as shutdown and 2nd argument as port of JMX.");
			} else {

This code attached also has Runtime.getRuntime().addShutdownHook()

The code startup line is for server:

java -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -classpath . com.bos.jmx.Main arg0

The code for shutdown of server is:

java -classpath . com.bos.jmx.Main shutdown 9999
package com.bos.jmx;

public class Shutdown implements ShutdownMBean {
	private static volatile boolean flagRunOne = false;

	public void shutdown() throws Exception {
		if (!flagRunOne) {
			System.out.println("Server shutting down...");
			//Sample shutdown code here
			System.out.println("Server shutdown.");
			flagRunOne = true;

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}