Ответ 1
JMX - это способ просмотра и управления временем выполнения вашего приложения. Это несколько похоже на концепцию SNMP, если это помогает. IMO, он незаменим для мониторинга и понимания серверных приложений, которые могут не иметь никакого другого пользовательского интерфейса, кроме записи в файл журнала.
Основной подход - создать интерфейс для объектов, которые вы хотите контролировать, а затем реализовать интерфейс класса, а затем зарегистрировать экземпляр этого класса с помощью "MBeanServer" (что фактически делает материал, определенный в интерфейсе доступным для приложений мониторинга JMX, таких как jconsole).
Здесь тривиальный, но рабочий пример:
(Я предполагаю, что Java 5 или лучше)
TestServerMBean.java
public interface TestServerMBean
{
public long getUptimeMillis();
public long getFooCount();
public void setFooCount(long val);
public void printStuff(String stuff);
}
TestServer.java:
import java.lang.management.ManagementFactory;
import java.util.concurrent.atomic.AtomicLong;
import javax.management.ObjectName;
// If jconsole doesn't see this app automatically, invoke the application with the following java flags, and connect
// 'remotely' via jconsole.
//
// -Dcom.sun.management.jmxremote
// -Dcom.sun.management.jmxremote.port=2222 (or whatever)
// -Dcom.sun.management.jmxremote.authenticate=false
// -Dcom.sun.management.jmxremote.ssl=false
public class TestServer implements TestServerMBean
{
private final AtomicLong m_counter = new AtomicLong(0L);
private final long m_startTimeMillis = System.currentTimeMillis();
public void run() throws InterruptedException {
while (true) {
m_counter.incrementAndGet();
Thread.sleep(5000);
}
}
public long getFooCount() {
return m_counter.get();
}
public void setFooCount(long val) {
m_counter.set(val);
}
public long getUptimeMillis() {
return System.currentTimeMillis() - m_startTimeMillis;
}
public void printStuff(String stuff) {
System.out.println(stuff);
}
public static void main(String[] args) throws Exception {
TestServer ts = new TestServer();
ManagementFactory.getPlatformMBeanServer().registerMBean(ts, new ObjectName("myapp:service=MyServer"));
ts.run();
}
}
Скомпилируйте и запустите TestServer.class как обычно, запустите jconsole
, подключитесь к TestServer (он будет автоматически отображаться, иначе см. комментарии в коде выше), а затем посмотрите вкладку "MBeans", и вы см. наш экземпляр с именем myapp:service=MyServer
. Вы можете просмотреть текущее "время безотказной работы" и наблюдать за шагом FooCounter
каждые 5 секунд. Вы также можете установить FooCounter на любое (длинное) значение, которое вы хотите, и вызвать метод printStuff
с любым аргументом String.
Очевидно, что это смешной "сервер", но, надеюсь, простой рабочий пример поможет проиллюстрировать общую концепцию: возможность заглянуть в рабочее приложение и управлять им.
Существует много дополнительных функций и различных типов MBeans, но только показанный выше ванильный JMX имеет большое значение, IMO.