ตกลงหลังจากความเป็นไปได้ทั้งหมดฉันได้เลือกที่จะทำงานกับ "Java Monitoring and Management"
ภาพรวมอยู่ที่นี่
ซึ่งช่วยให้คุณสามารถควบคุมแอปพลิเคชันหนึ่งจากอีกแอปหนึ่งได้อย่างง่ายดาย คุณสามารถเรียกใช้แอปพลิเคชันควบคุมจากสคริปต์เพื่อหยุดแอปพลิเคชันที่ควบคุมอย่างนิ่มนวลก่อนที่จะฆ่ามัน
นี่คือรหัสแบบง่าย:
แอปพลิเคชันที่ควบคุม:
รันด้วยพารามิเตอร์ VM folowing:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port = 9999
-Dcom.sun.management.jmxremote.authenticate = false
-Dcom.sun.management jmxremote.ssl = เท็จ
public interface ThreadMonitorMBean
{
String getName();
void start();
void stop();
boolean isRunning();
}
public class ThreadMonitor implements ThreadMonitorMBean
{
private Thread m_thrd = null;
public ThreadMonitor(Thread thrd)
{
m_thrd = thrd;
}
@Override
public String getName()
{
return "JMX Controlled App";
}
@Override
public void start()
{
System.out.println("remote start called");
}
@Override
public void stop()
{
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())
{
System.out.println(".");
try
{
Thread.sleep(1000);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
System.out.println("JMX stopped");
}
}
}
การควบคุมแอปพลิเคชัน:
เรียกใช้ด้วยการหยุดหรือเริ่มเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
public class ThreadMonitorConsole
{
public static void main(String[] args)
{
try
{
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();
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");
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();
}
jmxc.close();
System.out.println("Done.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
แค่นั้นแหละ. :-)