Tamam, "Java İzleme ve Yönetimi" ile çalışmayı seçtiğim tüm olasılıklardan sonra
Genel Bakış burada
Bu, bir uygulamayı diğerinden nispeten kolay bir şekilde kontrol etmenizi sağlar. Kontrollü uygulamayı sonlandırmadan önce incelikli bir şekilde durdurmak için bir komut dosyasından kontrol uygulamasını çağırabilirsiniz.
İşte basitleştirilmiş kod:
Kontrollü uygulama:
Aşağıdaki VM parametreleriyle çalıştırın:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port = 9999
-Dcom.sun.management.jmxremote.authenticate = false
-Dcom.sun.management. jmxremote.ssl = false
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");
}
}
}
Uygulamayı Kontrol:
ile çalıştırmak durdurmak veya başlatmak komut satırı argümanı olarak
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();
}
}
}
Bu kadar. :-)