DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Bosco has posted 2 posts at DZone. View Full User Profile

Java JMX Shutdown Gracefully with ShutdownHook example

07.30.2014
| 4873 views |
  • submit to reddit
package com.bos.jmx;

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

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

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 {
           mbean.shutdown();
         } catch (Exception e) {
           e.printStackTrace();
         }
       }
     });
   }

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...");
        mbeanProxy.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.");
					}
					clientExecuteShutdown(Integer.valueOf(args[1]));
			} else {
			useArg0(args[0]);
					initServerJMX();
	}	
	}

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
AttachmentSize
BosJMXShutdownGracefully.zip8.46 KB