[an error occurred while processing this directive] IT • archiv :: Print

IT • archiv


[an error occurred while processing this directive]

[an error occurred while processing this directive]

Приемы высшего пилотажа с помощью JMX

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive](none)
[an error occurred while processing this directive]([an error occurred while processing this directive] Тодд Баукер [an error occurred while processing this directive])

[an error occurred while processing this directive](none)

Интегрирование JMX в ваши JSP.

Server-Side Java
PDF versionPDF версия
Обзор
Когда-нибудь слышали о JMX? Если вам кажется, что это обычная второстепенная оболочка, то подумайте ещё раз. Java Management Extensions (JMX) постепенно занимает своё место в процессе разработки и управлении приложениями. Многие разработчики J2EE, такие как JBoss, Enhydra и WebLogic, уже пользуются ею. Предлагаем вам познакомиться с JMX и разобрать примеры её использования вместе с JSP. Попробуйте применить JMX в своей среде разработки. (2000 слов)

Давайте честно признаемся, что вопросы конфигурации любого сервера приложений могут доставить массу хлопот, при этом большинство проектов не могут позволить себе включить в цикл разработки ещё и конфигурационную оболочку. Выход предлагает Java Management Extensions (JMX): это оболочка позволяет вам видеть и управлять своим приложением, как с локального, так и с удаленного средства управления. JMX даёт вам возможность вызывать настройки конфигурации и изменять их непосредственно в процессе выполнения. Она также обеспечивает дополнительные виды услуг типа мониторинга, оповещения о событиях, тамера, динамической загрузки классов из XML-файлов. Вы можете использовать JMX для загрузки, инициализации, изменения и контроля над приложением и его распределёнными компонентами.

В данной статье мы рассмотрим некоторые особенности архитектуры JMX. Более детальное описание можно найти в спецификации на JSR-000003, которую можно также скачать. Можно заодно скачать дополнительные имплементации с исходным кодом. После изучения основных положений JMX, мы перейдём к работе с JavaServer Page (JSP) чтобы скоммутировать страницу с JMX, работающей с JBoss и Tomcat.

Составляющие JMX

Важнейшими для нас в данном случае составляющими JMX являются уровни контрольно-управленческих, агентских и распределённых услуг ( instrumentation, agent, distributed services ).

Контрольно-управленческий уровень

Контрольно-управленческий уровень отображает приложение в виде одного или нескольких управляемых бин-компонентов (MBeans). Каждый MBean обеспечивает доступ к своему состоянию с помощью открытых методов. MBean может быть любым объектом Java, который можно модифицировать с целью поддержки интерфейсов и семантики, оговоренной в спецификации JMX для того типа Mbean, который вы создали. Типы MBean бывают стандартными, динамичными, открытыми и модельными ( standard, dynamic, open, and model ).

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

Самым известным типом является стандартный Mbean. В качестве примера представьте себе, что у вас есть класс с именем Logger, который конфигурирует в приложении сообщения об исправлении ошибок, указывая имя log-файла и уровень сложности. Вы можете превратить Logger в стандартный MBean, создав интерфейс под названием LoggerMBean. Имея этот интерфейс, добавьте открытые методы setter и getter, чтобы можно было видеть имя файла и текстовые атрибуты. Примерами таких методов могут быть setFileName() и getFileName(). Как и для JavaBean, в качестве основы для названий этих методов решено использовать модель setXXX и getXXX. Чтобы до конца сложить головоломку, класс Logger должен реализовывать интефейс LoggerMBean, чтобы JMX-агент мог с помощью интроспекции создавать метаданные на Logger MBean. Mbean управляется JMX-агентом, вызывающим атрибуты и другие операционные методы, определённые в интерфейсе. Mbean является связующим звеном между управляемым ресурсом (вашим приложением) и остальными составляющими JMX-оболочки.

Агентский уровень

JMX-агенты — это следующий и наиболее интересный уровень. Агенты обеспечивают возможность дистанционного управления доступом к приложению для всех зарегистрированных MBean-компонентов. Этот уровень является ядром всей оболочки JMX. Агенты также содержат дополнительные функции вроде динамической загрузки и контроля. Эти сервисы по существу тоже являются зарегистрированными MBean-компонентами, а значит они тоже получают свою долю выгоды, работая в JMX. Главный агентский компонент называется MBean-сервером и определяется интерфейсом javax.management.MBeanServer. Чтобы создать сервер, вы инициируете статичный метод createMBeanServer(), обращающийся к MBeanServerFactory. Построитель (factory) будет также хранить ссылки ранее созданных MBean-серверов, тук что вам не придётся складывать их в кэш. Чтобы достать такую ссылку, вы вызываете findMBeanServer().

Уровень распределённых услуг

Уровень распределённых услуг (сервисов) содержит интерфейсы и компоненты, которыми пользуются удалённые средства управления для связи с агентами. Пока описания этих интерфейсов и остальных функций в текущей спецификации не рассматриваются в расчёте на следующую версию JMX. Хотя и вкратце, эта статья должна дать вам общее представление о JMX и используемой в ней терминологии. Присутствующие в данной статье примеры иллюстрируют правила интеграции JSP с JMX-агентами с целью настройки и управления параметрами конфигурации.

Установка и настройка Tomcat и JBoss

Tomcat и JBoss будут испольоваться в качестве серверов приложений, так что вам в начале придётся их установить. Следуйте этим инструкциям:

  1. Загрузите Tomcat и JBoss как один распределённый пакет с сайта SourceForge. Даже если у вас уже есть Tomcat, эта версия может оказаться удобнее, так как она уже сконфигурирована. В нашем примере используется связка JBoss-Tomcat 2.2.1.
  2. Скопируйте tools.jar из каталога lib в своём JDK в каталог lib в Tomcat. Это нужно для компиляции страниц JSP при запуске Tomcat внутри JBoss. В качестве альтернативного варианта, можно внести tools.jar в classpath.
  3. Скопируйте jmxri.jar из каталога lib в JBoss в каталог lib в Tomcat. Этот jar-файл содержит JMX-классы, на которые ссылается страница JSP.
  4. Протестируйте сервер, впечатав в каталог bin JBoss для Windows, или run.sh для Linux. Это консольное сообщение для запуска встроенного Tomcat (Embedded Tomcat), как части startup-процесса. Для отключения воспользуйтесь Ctrl-c.

Работа с JSP

JMX можно связать интерфейсом с JSP с целью обеспечения более простого управления приложением. Код JSP в Примере 1 взаимодействует с агентом JMX или MBean-сервером, находящимся внутри JBoss. Вам нужно скопировать Пример 1 и сохранить его в файле с именем jmx.jsp в каталог webapps/admin под маршрутом установки Tomcat (убедитесь, что JBoss работает, и укажите в браузере адрес httр://localhost:8080/admin/jmx.jsp).

Пример 1. JSP page.

<%@ page
      import="javax.management.*,java.util.*" %>

<%

    try {
      //Step 1 - Get MBean server reference

        ArrayList servers = MBeanServerFactory.findMBeanServer(null);
         if (servers == null)
          throw new Exception("No MBeanServer found.");
          MBeanServer server = (MBeanServer)servers.get(0);

       //Step 2 - Create object to identify MBean

        ObjectName objName =
    new ObjectName("DefaultDomain:service=Logging,type=File");

       //Step 3 - Update MBean with new log file name

        String newvalue = (String)request.getParameter("LogName");    
          if (newvalue != null && newvalue.length() > 0) {            
            Attribute attr =
                new Attribute("LogName", newvalue);            
            server.setAttribute( objName, attr );        
          }

       //Step 4 - Get latest log name attribute
        String value = (String)server.getAttribute
        ( objName, "LogName");

%>

MBean <%= objName.getCanonicalName() %>



<FORM METHOD="post" ACTION="jmx.jsp">  
 <TABLE  ALIGN="left" BORDER="1" WIDTH="40%"
CELLPADDING="3">
   <TR>
     <TH WIDTH="23%">Attribute </TH>
     <TH WIDTH="35%"> Value </TH>    
   </TR>  
   <TR>      
     <TD><B>LogName</B></A></TD>
     <TD><INPUT TYPE="text" NAME="LogName"
      VALUE="<%= value %>" SIZE="34%"></TD>
   </TR>
   <TR>
     <TD ALIGN=LEFT><INPUT TYPE="submit"
      VALUE="UPDATE"></TD>
   </TR>
 </TABLE>
</FORM>

<%  
 } catch (Exception e) {  
          out.println(e.getMessage());      
 }
%>

В результате выполнения Примера 1, в вашем браузере должно появиться окошко, показанное на Рисунке 1:

Результат выполнения кода из Примера 1.
Рисунок 1. Результат выполнения кода из Примера 1.

На Рисунке 1 показан org.jboss.logging.FileLoggingMBean с атрибутом, названным LogName. Этот атрибут представляет имя log-файла JBoss. Сначала, замените значение в текстовой строке на jbosslog и нажмите на кнопку Update. Затем войдите в каталог dist/log под JBoss, в котором хранится новый log-файл с именем jbosslog. Нажатие на кнопку Update инициирует метод setAttribute() MBean-сервера, который делегирует вызов методу setLogName() из FileLoggingMBean. И MBean-сервер, и JBoss, и страница JSP работают в одной и той же виртуальной машине (JVM). Так что такой подход можно использовать и применительно к своим собственным приложениям, чтобы приступить к внедрению JMX немедленно. Всё, что вам нужно, это создать MBean-сервер, зарегистрировать свои MBean-компоненты и написать свою страницу JSP. Это самый простой способ ввести JMX в используемую вами среду.

В качестве альтернативного подхода в этом случае будет использование класса HtmlAdapterServer из основной имплементации вместо своей собственной страницы JSP. Он включён в эталонную имплементацию JMX в файл jmxtools.jar. HtmlAdapterServer также является MBean-компонентом. Пример того, как может выглядеть страница, можно посмотреть, запустив JBoss-сервер и указав в браузере адрес httр://localhost:8082, чтобы увидеть все компоненты, которыми мы можем управлять. Вы, как и JBoss, тоже можете использовать HtmlAdapterServer, но вам едва ли понравится его формат.

Как работает код

Основная структура страницы должна быть интегрирована с MBean-сервером в своей верхней части, за которой следует форма HTML.

Шаг 1. Получите ссылку на сервер, вызвав статичный метод findMBeanServer(null) из построителя MBeanServerFactory. Работая с JBoss, мы рассчитываем на то, что там будет только один компонент. Если мы будет пользоваться интерфейсом MBean-сервера, нам придётся указать, к какому из MBean-компонентов мы посылаем сообщение.

Шаг 2. Создаём экземпляр класса ObjectName с каноническим именем MBean, передаваемым в конструктор по умолчанию. Шаблоном для канонического (стандартного) имени служит домен, которым может выступать DefaultDomain или обычный домен, за которым следует пара значений свойств, разделённых запятыми. Вам понадобится, по крайней мере, одна пара значений. Выглядеть это должно так: <>[domainName]:property=value[,property=value]*.

Шаг 3. Внесите в FileLoggerMBean новое имя log-файла, которое было выложено в странице JSP. Это делается путём создания JMX-объекта Attribute, с именем атрибута и значением, передаваемым в конструктор. Затем вызовите метод setAttribute() из MBean-сервера, передав в нем параметры Attribute <>и ObjectName. Эти параметры укажут MBean, с которым будет осуществляться взаимодействие, атрибут и соответствующее значение. Метод setAttribute() будет использовать метаданные MBean-компонента, хранящиеся на сервере, для инициирования подходящего setter-метода в MBean.

Шаг 4. Достаньте значение атрибута из FileLoggerMBean. Вызовите метод getAttribute() с помощью параметров ObjectName и имени атрибута в виде String. Возвращаемый объект должен быть таким же, какой возвращает getter-метод, как определено в интерфейсе FileLoggerMBean.

Функциональные услуги JMX

JMX делает гораздо больше, чем просто предоставляет рабочую оболочку для дистанционного управления. Она обеспечивает дополнительные услуги (services), способные занять ключевое место в процессе разработки. Приведу лишь краткое описание:

Заключение

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

Об авторе

Todd Bowker работает программистом в Солт Лэйк Сити, штат Юта. Тодд занимается программированием более 10 лет, с тех пор как окончил университет штата Орегон. В настоящее время занимается вопросами электронной коммерции на J2EE, доказывая, что Java может использоваться для внедрения объектно-ориентированных приложений масштаба предприятия.

Ресурсы

Reprinted with permission from the June 2001 edition of JavaWorld magazine. Copyright © ITworld.com, Inc., an IDG Communications company.
View the original article at: http://www.javaworld.com/javaworld/ jw-06-2001/jw-0608-jmx.html

Русский перевод опубликован с разрешения Java Журнал © IBA Java Team, 2001. Оригинал статьи: http://java.iba.by/javaweb/ibajavat.nsf/ lnarticlesview/7980749876BE28C142256A6A002CD9AA

[an error occurred while processing this directive]
[an error occurred while processing this directive] Перевод на русский © Андрей Чернухо, 2001
< Вернуться на caйт :: Copyright © 1999 — 2010, IT • archiv.