Определен JMX

Я ищу:

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

6 ответов

Решение

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.

Очевидно, что это нелепый "сервер", но, надеюсь, наличие простого рабочего примера поможет проиллюстрировать общую концепцию: возможность заглядывать в работающее приложение и манипулировать им.

Существует множество дополнительных функций и различных типов MBean-компонентов, но только показанный выше ванильный JMX имеет большое значение, IMO.

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

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

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

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

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

Дополнение:

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

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

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

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

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

Или вы можете посмотреть вики-тег JMX прямо здесь, в Stackru, я обновил его несколько дней назад, чтобы перечислить почти все, что вы просили, и некоторые внесли дополнительную информацию:

https://stackru.com/tags/jmx/info

Это те два, которые я прочитал, когда впервые прочитал о JMX.

Sun Tutorial: http://java.sun.com/docs/books/tutorial/jmx/index.html

Spring 2.5 / JMX: http://static.springframework.org/spring/docs/2.5.x/reference/jmx.html

Другие вопросы по тегам