隔江千里
好吧,在我选择使用“Java监控和管理” 概述之后的所有可能性之后,这允许您以相对简单的方式从另一个应用程序控制一个应用程序。您可以从脚本中调用控制应用程序,以便在杀死它之前正常地停止受控应用程序。这是简化的代码:受控应用程序:使用以下VM参数运行它:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 9999 -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management。 jmxremote.ssl = FALSE//ThreadMonitorMBean.javapublic interface ThreadMonitorMBean{String getName();void start();void stop();boolean isRunning();}// ThreadMonitor.javapublic class ThreadMonitor implements ThreadMonitorMBean{private Thread m_thrd = null;public ThreadMonitor(Thread thrd){ m_thrd = thrd;}@Overridepublic String getName(){ return "JMX Controlled App";}@Overridepublic void start(){ // TODO: start application here System.out.println("remote start called");}@Overridepublic void stop(){ // TODO: stop application here System.out.println("remote stop called"); m_thrd.interrupt();}public boolean isRunning(){ return Thread.currentThread().isAlive();}public static void main(String[] args){ try { System.out.println("JMX started"); ThreadMonitorMBean monitor = new ThreadMonitor(Thread.currentThread()); MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.example:type=ThreadMonitor"); server.registerMBean(monitor, name); while(!Thread.interrupted()) { // loop until interrupted System.out.println("."); try { Thread.sleep(1000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); } } } catch(Exception e) { e.printStackTrace(); } finally { // TODO: some final clean up could be here also System.out.println("JMX stopped"); }}}控制应用程序:使用stop或start作为命令行参数运行它public class ThreadMonitorConsole{public static void main(String[] args){ try { // connecting to JMX System.out.println("Connect to JMX service."); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:9999/jmxrmi"); JMXConnector jmxc = JMXConnectorFactory.connect(url, null); MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); // Construct proxy for the the MBean object ObjectName mbeanName = new ObjectName("com.example:type=ThreadMonitor"); ThreadMonitorMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, ThreadMonitorMBean.class, true); System.out.println("Connected to: "+mbeanProxy.getName()+", the app is "+(mbeanProxy.isRunning() ? "" : "not ")+"running"); // parse command line arguments if(args[0].equalsIgnoreCase("start")) { System.out.println("Invoke \"start\" method"); mbeanProxy.start(); } else if(args[0].equalsIgnoreCase("stop")) { System.out.println("Invoke \"stop\" method"); mbeanProxy.stop(); } // clean up and exit jmxc.close(); System.out.println("Done."); } catch(Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }}}而已。:-)