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;
}
}
}
Opinions expressed by DZone contributors are their own.
Comments