Я ищу:
- Что такое JMX.
- Где я могу найти несколько хороших руководств по JMX.
- Что JMX может дать мне как программисту Java EE.
- Что-нибудь еще, о чем я должен знать.
Я ищу:
JMX — это способ просмотра и управления состоянием выполнения вашего приложения. По своей концепции он чем-то похож на SNMP, если это поможет. ИМО, это необходимо для мониторинга и понимания приложений серверного типа, которые могут не иметь никакого другого пользовательского интерфейса, кроме записи в файл журнала.
Основной подход состоит в том, чтобы создать интерфейс для вещей, которые вы хотите отслеживать, затем реализовать интерфейс в классе, а затем зарегистрировать экземпляр этого класса с помощью «MBeanServer» (что фактически делает материал, определенный в интерфейсе, доступным для мониторинга JMX). приложения, такие как jconsole).
Вот тривиальный, но работающий пример:
(Я предполагаю Java 5 или лучше)
public interface TestServerMBean
{
public long getUptimeMillis();
public long getFooCount();
public void setFooCount(long val);
public void printStuff(String stuff);
}
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 с любым строковым аргументом.
Очевидно, что это нелепый «сервер», но, надеюсь, простой рабочий пример поможет проиллюстрировать общую концепцию: возможность заглянуть в работающее приложение и манипулировать им.
Есть много дополнительных функций и различных типов MBeans, но только показанный выше ванильный JMX имеет большое значение, IMO.
Короче говоря, JMX позволяет вам удаленно вызывать методы или просматривать открытые данные изнутри работающей JVM. Многие приложения используют JMX для подключения удаленной панели управления к работающим JVM для обеспечения удаленного управления.
Например, если у вас есть сервер приложений, работающий на машине, с помощью JMX можно будет удаленно просматривать открытую информацию об этом сервере. Также можно закодировать свои собственные JMX MBeans, которые могут отображать любые переменные или методы внутри вашего приложения. Затем открытые переменные могут быть «опрошены» удаленно для проверки определенных условий, о которых вы хотели бы знать.
Еще одна полезная особенность JMX заключается в том, что вы можете удаленно изменять переменные на лету. Например, если у вас настроен какой-либо пул с максимальной общей суммой, эту максимальную сумму можно изменить удаленно без необходимости перезапуска или изменения каких-либо файлов конфигурации на вашем сервере приложений.
jconsole предоставляется Sun вместе с Java, чтобы можно было легко просматривать ваши MBeans удаленно без необходимости кодировать собственное клиентское решение. Вы также можете использовать MBeans с помощью специального решения, которое может дать вам превосходную гибкость.
Кроме того, уже есть некоторое программное обеспечение для мониторинга, которое поставляется со встроенным мониторингом JMX MBean. Zenoss и Applications Manager 8 делают это, если назвать пару.
Дополнение:
Уже существует много программного обеспечения, использующего преимущества JMX. Tomcat предоставляет информацию, доступную через jconsole, как и JBoss Application Server.
Возможно, здесь стоит упомянуть и JSR 262.
«JSR 262 определяет коннектор для удаленного API JMX, который использует веб-службы для обеспечения удаленного доступа к инструментарию JMX. Клиенты не обязательно должны быть приложениями Java, но могут ими быть».
Весьма вероятно, что JSR 262 станет частью следующей версии Java (Java 7).
Существует проект java.net для соединителя JMX WS, который зависит от проект WiseMan. Wiseman — это Java-реализация стандарта WS-Management с открытым исходным кодом.
Вот несколько достойных веб-ресурсов:
Это два, которые я прочитал, когда впервые читал о JMX.
Учебное пособие Sun: 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
Или вы можете посмотреть вики тегов JMX прямо здесь, на StackOverflow, я обновил ее несколько дней назад, чтобы перечислить почти все, что вы просили, и некоторые предоставили дополнительную информацию:
https://stackoverflow.com/tags/jmx/info