Определенный JMX

Я ищу:

  • Что такое JMX.
  • Где я могу найти хороший JMX Учебники.
  • Что JMX может предоставить мне как Java EE-программист.
  • Что-нибудь еще я должен знать из.

Ответ 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.

Ответ 2

В двух словах, JMX позволяет удаленно вызывать методы или просматривать открытые данные изнутри работающей JVM. Многие приложения используют JMX для своего рода прикрепления удаленной панели мониторинга к своим работающим JVM для обеспечения удаленного управления.

Например, если у вас на компьютере запущен сервер приложений, с JMX можно было бы удаленно просматривать открытую информацию об этом сервере. Также возможно написать свой собственный JMX MBean, который может предоставлять любые переменные или методы внутри вашего приложения. Затем открытые переменные могут быть "опрошены" удаленно для проверки определенных условий, о которых вы хотели бы знать.

Еще одна полезная вещь в JMX - это то, что вы можете удаленно изменять переменные на лету. Например, если у вас настроен какой-то пул с максимальной общей суммой, эту максимальную сумму можно изменить удаленно, без перезапуска или изменения каких-либо файлов конфигурации на сервере приложений.

Sun предоставляет jconsole с Java, чтобы иметь возможность легко просматривать ваши MBean-компоненты удаленно, не кодируя собственное клиентское решение. Вы также можете использовать MBeans с пользовательским решением, которое может дать вам отличную гибкость.

Кроме того, уже есть некоторое программное обеспечение для мониторинга, которое поставляется со встроенным JMX MBean-мониторингом. Zenoss и Applications Manager 8 делают это, чтобы назвать пару.

Дополнение:

Уже есть много программного обеспечения, которое использует JMX. Tomcat предоставляет информацию, доступную через jconsole, и сервер приложений JBoss.

Ответ 3

Возможно, JSR 262 также стоит упомянуть здесь.

"JSR 262 определяет соединитель для JMX Remote API, который использует веб-службы для удаленного доступа к инструментарию JMX. Клиенты не обязательно должны быть Java-приложениями, но могут быть."

Весьма вероятно, что JSR 262 станет частью следующей версии Java (Java 7).

Существует проект java.net для соединителя JMX WS, который зависит от Проект WiseMan. Wiseman - это Java-версия с открытым исходным кодом стандарта WS-Management.