JMX. Мониторинг и управление Java-приложениями
Что такое JMX? Если вы думаете, что это еще один побочный framework, не заслуживающий вашего внимания, то глубоко заблуждаетесь. Java Management eXtensions (JMX) — это фактически одна из самых основных функциональных частей современного процесса разработки и управления приложениями. Эту технологию сегодня используют такие производители J2EE-серверов, как JBoss, WebLogic и многие другие. Ниже мы рассмотрим структуру JMX и примеры использования этой технологии вместе с JSP. После прочтения данного материала вы без проблем сможете встраивать функциональность JMX в свои собственные приложения.
Введение в JMX
Технология JMX (Java Management eXtensions) — это сравнительно новый стандарт компании Sun Microsystems, который позволяет Java-разработчикам интегрировать свои приложения с существующими решениями сетевого управления. JMX определяет стандарт для написания JMX-объектов, так называемых MBean'ов. MBean'ы "живут" внутри своего container'а. Таким образом, любой JMX-клиент (в качестве которого может выступать, например, удаленное или локальное приложение) имеет возможность вызывать методы и получать доступ к атрибутам этих MBean'ов с помощью container'а, в котором они содержатся. Кроме того, приложение также может получать специальные уведомления от MBean'ов, если это приложение зарегистрирует соответствующие listener MBean'ы. Управление конфигурацией любого сервера приложений может оказаться тщетной задачей, и большинство проектов просто не включают в цикл разработки конфигурационный framework. В этом случае JMX приходит на помощь: теперь в вашем распоряжении есть framework многократного использования для внедрения в ваши приложения функций удаленных и локальных инструментов управления. JMX позволяет запрашивать конфигурационные установки и изменять их во время выполнения приложения. Кроме этого, JMX предоставляет и другие сервисы — такие, как, например, мониторинг, уведомления о событиях, таймер и динамическая загрузка классов из XML-файлов. Вы можете использовать JMX для загрузки, инициализации, изменения и мониторинга ваших приложений и их распределенных компонентов. Подробная спецификация технологии JMX находится в документе JSR-000003 ( сайт ). После архитектуры технологии JMX мы рассмотрим примеры использования JMX вместе с технологией JSP с помощью сервера приложений JBoss и сервлет-container'а Tomcat.
Архитектура JMX
Архитектура технологии JMX строится на трехуровневой модели. Три логических layer'а: instrumentation, agent и layer распределенных сервисов (управляющий layer). Поскольку технология JMX строилась с учетом уже существующих технологий управления, она также предоставляет интерфейсы к самым широко распространенным на сегодняшний день протоколам: программные интерфейсы для дополнительных протоколов управления предоставляют средства взаимодействия с другими средами управления. Понятно, что цель этих интерфейсов — более тесная интеграция с уже существующими решениями в сфере управления приложениями.
Layer Instrumentation
Этот layer трактует приложение как один или несколько управляемых компонентов MBean'ов (Managed Bean). Каждый MBean предоставляет возможность управлять своим состоянием с помощью общедоступных public-методов. MBean'ом может быть любой Java-объект, который вы модифицируете так, чтобы он поддерживал интерфейсы и семантику, определенную в спецификации JMX.
MBean'ы бывают четырех типов: standard, dynamic, open и model:
1. Standard MBean обеспечивает статический (static) интерфейс.
2. Dynamic MBean передает свой интерфейс JMX-агенту во время выполнения приложения с использованием метаданных.
3. Open MBean — это тот же dynamic MBean, но использующий предопределенные типы данных Java таким образом, что зависимости от других классов ослабляются, позволяя улучшить производительность и динамическое поведение этого компонента.
4. Model MBean — как следует из названия, это общий и настраиваемый MBean, который поставляется с каждой реализацией JMX. Вы можете создать экземпляр и использовать model MBean'ы вместо определения своих собственных MBean-классов.
Standard MBean — наиболее распространенный тип. Например, предположим, что у вас есть класс с именем Logger, который формирует отладочные сообщения вашего приложения и при этом содержит в себе поля для имени журнального файла (в который будут заноситься эти сообщения) и уровня подробности сообщений. Мы можем завернуть этот класс Logger в MBean типа standard, создав новый интерфейс с именем LoggerMBean. В этом интерфейсе мы добавляем общедоступные (public) getter- и setter-методы для установки и изменения значений имени файла и уровня подробности сообщений. Эти методы для изменения атрибута имени файла могут называться, например, setFilename() и getFilename(). И, наконец, классу Logger нужно реализовать интерфейс LoggerMBean так, чтобы агент JMX смог самостоятельно все проанализировать и сгенерировать метаданные о MBean'е класса Logger. Этот MBean управляется с помощью агента JMX вызовами методов, определенных в интерфейсе (в нашем случае — в интерфейсе LoggerMBean). В общем случае MBean — это связь между управляемым ресурсом (вашим приложением) и остальным framework'ом JMX.
Layer Agent
Следующий наиболее интересный layer framework'а JMX — это layer agent. Агент (agent) предоставляет удаленный доступ к управлению приложением всем своим зарегистрированным MBean'ам. Можно смело сказать, что это центральная часть framework'а JMX. Агент также обеспечивает дополнительные сервисы типа мониторинга и динамической загрузки классов. Эти сервисы также являются зарегистрированными MBean'ам. Основной компонент агента называется MBean-сервером и определяется интерфейсом javax.management.MBeanServer. Для того чтобы создать сервер, вы должны вызвать статический метод createMBeanServer() класса MBeanServerFactory. Этот класс-фабрика хранит также ссылки на все MBean-серверы, которые были созданы раньше. Поэтому от вас не требуется кэшировать их. Найти ссылку на нужный MBean-сервер вы можете с помощью метода findMBeanServer().
Layer распределенных сервисов (distributed services)
Последний из рассматриваемых нами layer'ов — layer распределенных сервисов управления. Он обеспечивает интерфейс, который удаленные инструменты используют для взаимодействия с агентами. Итак, мы очень кратко рассмотрели структуру framework'а JMX, получили некоторые сведения о том, зачем он нужен и как функционирует. Следующим этапом разберем практическое использование этой технологии на конкретном примере.
JMX и JSP
Технология JMX может использоваться вместе с JSP, чтобы предоставить простой способ управления приложениями. Приведенный ниже пример, выполненный в виде кода JSP, работает с JMX-агентом (или MBean-сервером), который находится внутри сервера JBoss. Возьмите листинг этой программы и сохраните его под именем, например, JMXExample1.jsp, а затем скопируйте в директорию webapps/JMXExamples (предварительно ее создав) относительно корневой директории вашего сервера Tomcat (убедитесь, что вы запустили JBoss). После чего введите в вашем браузере следующий адрес: http://localhost:8080/JMXExamples/JMXExample1.jsp. Как результат работы этой JSP-страницы в вашем браузере должно быть что-то похожее на следующее изображение:
Рис. 1. Результат выполнения кода JSP
На рис. 1 показан атрибут LogName класса org.jboss.logging.FileLoggingMBean. Этот атрибут представляет имя журнального файла сервера JBoss. Сейчас попробуйте изменить значение текстового поля на, к примеру, "newlogfile" и нажмите на кнопку Обновить. Теперь зайдите в директорию dist/log относительно корневой директории установленного сервера JBoss. Там вы увидите новый журнальный файл с именем newlogfile. Нажатие на кнопку Обновить вызывает метод setAttribute() MBean-сервера, который поручает этот вызов методу setLogName() интерфейса FireLoggingMBean. Следует учесть, что MBean-сервер, JBoss и JSP-страница работают внутри одной и той же виртуальной Java-машины (JVM). Используя этот же подход, вы без труда можете интегрировать JMX с вашими собственными приложениями. Все, что вам нужно — это создать MBean-сервер, зарегистрировать в нем ваши MBean'ы и после этого написать свою JSP-страницу или любое другое приложение, с помощью которого хотите осуществлять управление. Это самый простой способ добавления функциональности технологии JMX в ваш уже существующий проект.
Альтернативный подход состоит в использовании класса HtmlAdapterServer из стандартной реализации JMX вместо разработки вашей собственной JSP- страницы. Этот класс находится в файле jmxtools.jar. HtmlAdapterServer — это тоже MBean-компонент. Пример того, как выглядит страница управления с помощью этого класса, вы можете посмотреть, запустив сервер JBoss и введя в адресной строке вашего браузере адрес http://localhost:8082.
Как это все работает?
Итак, сейчас мы более подробно рассмотрим все операции, которые выполняли.
1. На первом этапе мы получаем ссылку на MBean-сервер с помощью вызова статического метода findMBeanServer(null) класса-фабрики
MBeanServerFactory. Передача значения null в качестве параметра этому методу означает, что вы хотите получить все серверы, известные данному классу-фабрике. В нашем случае нам нужен только один-единственный от JBoss. При использовании интерфейса MBean-сервера вам нужно определить, какому MBean'у вы собираетесь посылать сообщения (т.е. чьи методы вы будете вызывать).
2. Далее создаем объект класса ObjectName. В качестве параметра мы передаем каноническое имя нашего MBean'а его конструктору. Шаблон имени состоит из домена (domain), который может быть либо DefaultDomain, либо какой-то свой домен. За доменом следуют пары <свойство=значение>, разделенные запятыми. Здесь нужно указать как минимум одну такую пару. Формат шаблона в общем виде выглядит следующим образом:
[имяДомена]:свойство=значение[,свойство=значение]*.
3. На третьем этапе мы обновляем FileLoggingMBean новым значением имени журнального файла, которое было передано JSP-странице. Для этого мы создаем объект класса Attribute framework'а JMX и передаем его конструктору в качестве параметров имя атрибута и его значение. После этого мы вызываем метод setAttribute() MBean-сервера, передавая ему созданные нами ранее объекты классов Attribute и ObjectName как параметры. Эти параметры помогают понять, с каким MBean'ом мы будем иметь дело, а также задают атрибут и его значение. Метод setAttribute() будет использовать метаданные MBean'а, хранящиеся на MBean-сервере, чтобы вызвать подходящий setter-метод этого MBean'а.
4. И, наконец, мы получаем с помощью метода getAttribute() значение атрибута из FileLoggerMBean. Этому методу мы передаем следующие параметры: объект класса ObjectName и имя атрибута в виде строки String. Вам также нужно привести тип возвращаемого объекта к тому, что возвращает getter-метод. Этот тип определен, естественно, в интерфейсе FileLoggerMBean.
Дополнительные возможности JMX
JMX позволяет выполнять гораздо больше функций, чем простой framework удаленного управления. Он предоставляет дополнительные сервисы, которые вы можете сделать основной частью вашего процесса разработки. Ниже приведем небольшой список этих возможностей:
. Уведомления о событиях. Интерфейсы снабжены возможностью распространения уведомлений среди "слушателей" (listeners) событий. Событием может являться, например, изменение атрибута. Это позволяет MBean'ам взаимодействовать с другими MBean'ами или удаленным менеджером и оповещать друг друга об изменениях состояния.
. Мониторинг. Monitor MBeans могут посылать уведомления о событиях зарегистрированным у них listeners. Listener'ом может быть другой MBean или приложение. Целевыми объектами наблюдений за атрибутами могут быть: counter, gauge и string. Подробнее о них вы можете прочитать в спецификации.
. Таймер. Timer MBean будет посылать уведомления зарегистрированным listener'ам по наступлению определенного времени или истечению заданного интервала.
Резюме
JMX — значимый и крайне полезный framework, который вы уже сейчас можете с минимальными усилиями интегрировать с вашими приложениями. Кроме этого, он может легко интегрироваться с уже существующими технологиями управления, например, SNMP, а также технологиями будущего, например, CIM/WBEM.
Алексей Литвинюк (c), litvinuke@tut.by
Введение в JMX
Технология JMX (Java Management eXtensions) — это сравнительно новый стандарт компании Sun Microsystems, который позволяет Java-разработчикам интегрировать свои приложения с существующими решениями сетевого управления. JMX определяет стандарт для написания JMX-объектов, так называемых MBean'ов. MBean'ы "живут" внутри своего container'а. Таким образом, любой JMX-клиент (в качестве которого может выступать, например, удаленное или локальное приложение) имеет возможность вызывать методы и получать доступ к атрибутам этих MBean'ов с помощью container'а, в котором они содержатся. Кроме того, приложение также может получать специальные уведомления от MBean'ов, если это приложение зарегистрирует соответствующие listener MBean'ы. Управление конфигурацией любого сервера приложений может оказаться тщетной задачей, и большинство проектов просто не включают в цикл разработки конфигурационный framework. В этом случае JMX приходит на помощь: теперь в вашем распоряжении есть framework многократного использования для внедрения в ваши приложения функций удаленных и локальных инструментов управления. JMX позволяет запрашивать конфигурационные установки и изменять их во время выполнения приложения. Кроме этого, JMX предоставляет и другие сервисы — такие, как, например, мониторинг, уведомления о событиях, таймер и динамическая загрузка классов из XML-файлов. Вы можете использовать JMX для загрузки, инициализации, изменения и мониторинга ваших приложений и их распределенных компонентов. Подробная спецификация технологии JMX находится в документе JSR-000003 ( сайт ). После архитектуры технологии JMX мы рассмотрим примеры использования JMX вместе с технологией JSP с помощью сервера приложений JBoss и сервлет-container'а Tomcat.
Архитектура JMX
Архитектура технологии JMX строится на трехуровневой модели. Три логических layer'а: instrumentation, agent и layer распределенных сервисов (управляющий layer). Поскольку технология JMX строилась с учетом уже существующих технологий управления, она также предоставляет интерфейсы к самым широко распространенным на сегодняшний день протоколам: программные интерфейсы для дополнительных протоколов управления предоставляют средства взаимодействия с другими средами управления. Понятно, что цель этих интерфейсов — более тесная интеграция с уже существующими решениями в сфере управления приложениями.
Layer Instrumentation
Этот layer трактует приложение как один или несколько управляемых компонентов MBean'ов (Managed Bean). Каждый MBean предоставляет возможность управлять своим состоянием с помощью общедоступных public-методов. MBean'ом может быть любой Java-объект, который вы модифицируете так, чтобы он поддерживал интерфейсы и семантику, определенную в спецификации JMX.
MBean'ы бывают четырех типов: standard, dynamic, open и model:
1. Standard MBean обеспечивает статический (static) интерфейс.
2. Dynamic MBean передает свой интерфейс JMX-агенту во время выполнения приложения с использованием метаданных.
3. Open MBean — это тот же dynamic MBean, но использующий предопределенные типы данных Java таким образом, что зависимости от других классов ослабляются, позволяя улучшить производительность и динамическое поведение этого компонента.
4. Model MBean — как следует из названия, это общий и настраиваемый MBean, который поставляется с каждой реализацией JMX. Вы можете создать экземпляр и использовать model MBean'ы вместо определения своих собственных MBean-классов.
Standard MBean — наиболее распространенный тип. Например, предположим, что у вас есть класс с именем Logger, который формирует отладочные сообщения вашего приложения и при этом содержит в себе поля для имени журнального файла (в который будут заноситься эти сообщения) и уровня подробности сообщений. Мы можем завернуть этот класс Logger в MBean типа standard, создав новый интерфейс с именем LoggerMBean. В этом интерфейсе мы добавляем общедоступные (public) getter- и setter-методы для установки и изменения значений имени файла и уровня подробности сообщений. Эти методы для изменения атрибута имени файла могут называться, например, setFilename() и getFilename(). И, наконец, классу Logger нужно реализовать интерфейс LoggerMBean так, чтобы агент JMX смог самостоятельно все проанализировать и сгенерировать метаданные о MBean'е класса Logger. Этот MBean управляется с помощью агента JMX вызовами методов, определенных в интерфейсе (в нашем случае — в интерфейсе LoggerMBean). В общем случае MBean — это связь между управляемым ресурсом (вашим приложением) и остальным framework'ом JMX.
Layer Agent
Следующий наиболее интересный layer framework'а JMX — это layer agent. Агент (agent) предоставляет удаленный доступ к управлению приложением всем своим зарегистрированным MBean'ам. Можно смело сказать, что это центральная часть framework'а JMX. Агент также обеспечивает дополнительные сервисы типа мониторинга и динамической загрузки классов. Эти сервисы также являются зарегистрированными MBean'ам. Основной компонент агента называется MBean-сервером и определяется интерфейсом javax.management.MBeanServer. Для того чтобы создать сервер, вы должны вызвать статический метод createMBeanServer() класса MBeanServerFactory. Этот класс-фабрика хранит также ссылки на все MBean-серверы, которые были созданы раньше. Поэтому от вас не требуется кэшировать их. Найти ссылку на нужный MBean-сервер вы можете с помощью метода findMBeanServer().
Layer распределенных сервисов (distributed services)
Последний из рассматриваемых нами layer'ов — layer распределенных сервисов управления. Он обеспечивает интерфейс, который удаленные инструменты используют для взаимодействия с агентами. Итак, мы очень кратко рассмотрели структуру framework'а JMX, получили некоторые сведения о том, зачем он нужен и как функционирует. Следующим этапом разберем практическое использование этой технологии на конкретном примере.
JMX и JSP
Технология JMX может использоваться вместе с JSP, чтобы предоставить простой способ управления приложениями. Приведенный ниже пример, выполненный в виде кода JSP, работает с JMX-агентом (или MBean-сервером), который находится внутри сервера JBoss. Возьмите листинг этой программы и сохраните его под именем, например, JMXExample1.jsp, а затем скопируйте в директорию webapps/JMXExamples (предварительно ее создав) относительно корневой директории вашего сервера Tomcat (убедитесь, что вы запустили JBoss). После чего введите в вашем браузере следующий адрес: http://localhost:8080/JMXExamples/JMXExample1.jsp. Как результат работы этой JSP-страницы в вашем браузере должно быть что-то похожее на следующее изображение:
Рис. 1. Результат выполнения кода JSP
На рис. 1 показан атрибут LogName класса org.jboss.logging.FileLoggingMBean. Этот атрибут представляет имя журнального файла сервера JBoss. Сейчас попробуйте изменить значение текстового поля на, к примеру, "newlogfile" и нажмите на кнопку Обновить. Теперь зайдите в директорию dist/log относительно корневой директории установленного сервера JBoss. Там вы увидите новый журнальный файл с именем newlogfile. Нажатие на кнопку Обновить вызывает метод setAttribute() MBean-сервера, который поручает этот вызов методу setLogName() интерфейса FireLoggingMBean. Следует учесть, что MBean-сервер, JBoss и JSP-страница работают внутри одной и той же виртуальной Java-машины (JVM). Используя этот же подход, вы без труда можете интегрировать JMX с вашими собственными приложениями. Все, что вам нужно — это создать MBean-сервер, зарегистрировать в нем ваши MBean'ы и после этого написать свою JSP-страницу или любое другое приложение, с помощью которого хотите осуществлять управление. Это самый простой способ добавления функциональности технологии JMX в ваш уже существующий проект.
Альтернативный подход состоит в использовании класса HtmlAdapterServer из стандартной реализации JMX вместо разработки вашей собственной JSP- страницы. Этот класс находится в файле jmxtools.jar. HtmlAdapterServer — это тоже MBean-компонент. Пример того, как выглядит страница управления с помощью этого класса, вы можете посмотреть, запустив сервер JBoss и введя в адресной строке вашего браузере адрес http://localhost:8082.
Как это все работает?
Итак, сейчас мы более подробно рассмотрим все операции, которые выполняли.
1. На первом этапе мы получаем ссылку на MBean-сервер с помощью вызова статического метода findMBeanServer(null) класса-фабрики
MBeanServerFactory. Передача значения null в качестве параметра этому методу означает, что вы хотите получить все серверы, известные данному классу-фабрике. В нашем случае нам нужен только один-единственный от JBoss. При использовании интерфейса MBean-сервера вам нужно определить, какому MBean'у вы собираетесь посылать сообщения (т.е. чьи методы вы будете вызывать).
2. Далее создаем объект класса ObjectName. В качестве параметра мы передаем каноническое имя нашего MBean'а его конструктору. Шаблон имени состоит из домена (domain), который может быть либо DefaultDomain, либо какой-то свой домен. За доменом следуют пары <свойство=значение>, разделенные запятыми. Здесь нужно указать как минимум одну такую пару. Формат шаблона в общем виде выглядит следующим образом:
[имяДомена]:свойство=значение[,свойство=значение]*.
3. На третьем этапе мы обновляем FileLoggingMBean новым значением имени журнального файла, которое было передано JSP-странице. Для этого мы создаем объект класса Attribute framework'а JMX и передаем его конструктору в качестве параметров имя атрибута и его значение. После этого мы вызываем метод setAttribute() MBean-сервера, передавая ему созданные нами ранее объекты классов Attribute и ObjectName как параметры. Эти параметры помогают понять, с каким MBean'ом мы будем иметь дело, а также задают атрибут и его значение. Метод setAttribute() будет использовать метаданные MBean'а, хранящиеся на MBean-сервере, чтобы вызвать подходящий setter-метод этого MBean'а.
4. И, наконец, мы получаем с помощью метода getAttribute() значение атрибута из FileLoggerMBean. Этому методу мы передаем следующие параметры: объект класса ObjectName и имя атрибута в виде строки String. Вам также нужно привести тип возвращаемого объекта к тому, что возвращает getter-метод. Этот тип определен, естественно, в интерфейсе FileLoggerMBean.
Дополнительные возможности JMX
JMX позволяет выполнять гораздо больше функций, чем простой framework удаленного управления. Он предоставляет дополнительные сервисы, которые вы можете сделать основной частью вашего процесса разработки. Ниже приведем небольшой список этих возможностей:
. Уведомления о событиях. Интерфейсы снабжены возможностью распространения уведомлений среди "слушателей" (listeners) событий. Событием может являться, например, изменение атрибута. Это позволяет MBean'ам взаимодействовать с другими MBean'ами или удаленным менеджером и оповещать друг друга об изменениях состояния.
. Мониторинг. Monitor MBeans могут посылать уведомления о событиях зарегистрированным у них listeners. Listener'ом может быть другой MBean или приложение. Целевыми объектами наблюдений за атрибутами могут быть: counter, gauge и string. Подробнее о них вы можете прочитать в спецификации.
. Таймер. Timer MBean будет посылать уведомления зарегистрированным listener'ам по наступлению определенного времени или истечению заданного интервала.
Резюме
JMX — значимый и крайне полезный framework, который вы уже сейчас можете с минимальными усилиями интегрировать с вашими приложениями. Кроме этого, он может легко интегрироваться с уже существующими технологиями управления, например, SNMP, а также технологиями будущего, например, CIM/WBEM.
Алексей Литвинюк (c), litvinuke@tut.by
Компьютерная газета. Статья была опубликована в номере 34 за 2005 год в рубрике программирование :: разное