Java JMX Shutdown Gracefully with ShutdownHook example
Join the DZone community and get the full member experience.
Join For FreeFor 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
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;
}
}
}
Java (programming language)
Opinions expressed by DZone contributors are their own.
Comments