Главная » Spring » Удаленные компоненты MBean Spring

0

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

В ответ на необходимость иметь стандартный механизм удален- ных JMX-взаимодействий организация Java Community Process выработала спецификацию JSR-160, «Java Management Extensions Remote API Specification» (Спецификация удаленного API расшире- ний управления Java). Данная спецификация определяет стандарт- ный удаленный API для JMX, требующий как минимум использо- вания RMI и дополнительно – протокола обмена сообщениями JMX (JMX Messaging Protocol, JMXMP).

В этом разделе мы познакомимся с поддержкой удаленных управ- ляемых компонентов MBean в Spring. Для начала настроим экспор- тирование HomeController как удаленного управляемого компонента MBean. А затем посмотрим, как с помощью Spring организовать управление этим удаленным компонентом MBean.

Экспортирование удаленного компонента MBean

Самое простое, что можно сделать, чтобы обеспечить удаленный доступ к управляемому компоненту MBean, – настроить компонент Spring ConnectorServerFactoryBean:

<bean  class=

"org.springframework.jmx.support.ConnectorServerFactoryBean"    />

Компонент ConnectorServerFactoryBean создает и запускает сервер JMXConnectorServer, определяемый спецификацией JSR-160. По умол- чанию сервер использует протокол JMXMP и прослушивает порт 9875, то есть он привязан к URL service:jmx:jmxmp://localhost:9875. Но мы не ограничены исключительно протоколом JMXMP.

В зависимости от реализации JMX в вашем распоряжении на выбор может иметься несколько протоколов удаленных взаимо- действий, включая RMI, SOAP, Hessian/Burlap и даже IIOP. Чтобы определить другой протокол взаимодействий с удаленным компо- нентом MBean, достаточно просто определить свойство serviceUrl компонента ConnectorServerFactoryBean. Например, чтобы задейство- вать протокол RMI для связи с удаленным компонентом MBean, можно определить свойство serviceUrl, как показано ниже:

<bean    class="org.springframework.jmx.support.ConnectorServerFactoryBean" p:serviceUrl=

"service:jmx:rmi://localhost/jndi/rmi://localhost:1099/spitter"  />

Здесь выполняется связывание с реестром RMI, действующим на локальном компьютере и обслуживающим порт 1099. Это так- же означает необходимость запустить реестр RMI, указав ему этот номер порта. Как рассказывалось в главе 11, реестр RMI можно за- пускать автоматически, с помощью компонента RmiServiceExporter. Но в данном случае компонент RmiServiceExporter не используется, поэтому реестр RMI следует запустить вручную, объявив компонент RmiRegistryFactoryBean, как показано ниже:

<bean   class="org.springframework.remoting.rmi.RmiRegistryFactoryBean" p:port="1099"  />

Вот и все! Теперь все наши управляемые компоненты MBean бу- дут доступны посредством RMI. Но осталось еще кое-что – пока еще

не реализована возможность обращения к удаленным управляемым компонентам MBean посредством RMI. Поэтому обратим свое вни- мание на сторону клиента и посмотрим, как связаться с удаленным компонентом MBean с помощью Spring.

Доступ к удаленным компонентам MBean

Организация доступа к удаленному серверу MBean связана с на- стройкой MBeanServerConnectionFactoryBean в контексте Spring. Следую- щее объявление определяет настройки компонента MBeanServerConnec tionFactoryBean, который можно использовать для доступа к удален- ному RMI-серверу, созданному в предыдущем разделе:

<bean id="mBeanServerClient" class=

"org.springframework.jmx.support.MBeanServerConnectionFactoryBean" p:serviceUrl=

"service:jmx:rmi://localhost/jndi/rmi://localhost:1099/spitter"/>

Как следует из имени компонента MBeanServerConnectionFactoryBean, это фабричный компонент, создающий объекты MBeanServerConnection. Объекты MBeanServerConnection действуют как локальные прокси-объ- екты, обеспечивающие возможность взаимодействий с удаленным сервером MBean. Его можно внедрять в свойства компонентов, как любой другой компонент:

<bean   id="jmxClient"   class="com.springinaction.jmx.JmxClient">

<property name="mbeanServerConnection" ref="mBeanServerClient" />

</bean>

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

int mbeanCount = mbeanServerConnection.getMBeanCount(); System.out.println("There  are  "  +  mbeanCount  +  "  MBeans");

У удаленного сервера можно также запросить имена всех управляе- мых компонентов MBean, воспользовавшись методом queryNames():

java.util.Set  mbeanNames  =  mbeanServerConnection.queryNames(null,  null);

Два параметра, передаваемые методу queryNames(), используются для фильтрации результатов. Если передать значение null  в обоих параметрах, метод вернет имена всех зарегистрированных управляе- мых компонентов.

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

Для доступа к атрибутам управляемых компонентов можно ис- пользовать методы getAttribute() и setAttribute(). Например, чтобы получить значение атрибута управляемого компонента, можно вы- звать метод getAttribute(), как показано ниже:

String   cronExpression   =   mbeanServerConnection.getAttribute(

new   ObjectName("spitter:name=HomeController"),   "spittlesPerPage");

Аналогично изменить значение атрибута управляемого компонен- та можно с помощью метода setAttribute():

mbeanServerConnection.setAttribute(

new ObjectName("spitter:name=HomeController"), new     Attribute("spittlesPerPage",     10));

Если потребуется вызвать операцию управляемого компонента, метод invoke() – это то, что вам нужно. Ниже показано, как вызвать метод setSpittlesPerPage()  управляемого компонента HomeController:

mbeanServerConnection.invoke(

new ObjectName("spitter:name=HomeController"), "setSpittlesPerPage",

new Object[] { 100 }, new  String[]  {"int"});

С помощью методов объекта MBeanServerConnection можно выпол- нять десятки других операций с удаленными компонентами MBean. Оставляю исследование этих возможностей в качестве самостоя- тельного упражнения.

Но вызов методов и изменение значений атрибутов удаленных компонентов MBean выполняется очень неудобно, когда эти опе-

рации производятся посредством MBeanServerConnection. Даже вызов такого простого метода, как setSpittlesPerPage(), сопряжен с необхо- димостью создания экземпляра ObjectName и передачи дополнитель- ных параметров методу invoke(). Обращение к методам управляемых компонентов выглядит намного сложнее, чем обращение к обычным методам. Более простой способ обращения к удаленным компонен- там MBean предоставляют прокси-объекты.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии