Статьи

Spring Rich Клиенты с JMX и Java VisualVM


Давайте
применим Java VisualVM к практическому использованию. Мы возьмем простую демонстрацию Spring Rich Client, которая распространяется вместе с дистрибутивом Spring Rich Client, украсим ее тегами и аннотациями с поддержкой JMX, а затем проследим за одним из его компонентов из Java VisualVM.

 

Примечание. Что касается Spring и JMX, глава 20: JMX из онлайн-документации Spring не может быть рекомендована достаточно высоко. Все, что следует ниже, предполагает, что вы прочитали и поняли эту главу.

 

Мы начинаем с настройки нашего экземпляра класса Spring MBeanExporter, где мы объявляем наш объект домена «Контакт» как JMX-компонент и вводим некоторые начальные значения для двух атрибутов домена:

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="beans">
<map>
<entry key="bean:name=customerBean" value-ref="customerBean"/>
</map>
</property>
</bean>

<bean id="customerBean" class="domain.Contact">
<property name="firstName" value="Harry"/>
<property name="lastName" value="Potter"/>
</bean>

 

Далее нам просто нужно аннотировать наш доменный объект «Контакт»:

...
...
...
@ManagedResource(objectName = "app.SimpleApp:type=SpringDemo", description = "Simple Example")
public class Contact {
...
...
...

 

Затем запустите приложение во время работы Java VisualVM с установленным плагином MBeans. Откройте вкладку приложения и посмотрите вкладку MBeans. Вы должны увидеть следующее:

 

Мы раскрыли все атрибуты нашего доменного объекта. Давай не будем этого делать. Сначала прочитайте раздел 20.3 вышеупомянутой справочной главы. Затем, чтобы ограничить атрибуты, предоставляемые серверу JMX, давайте дадим себе некоторый контроль над нашим MBean:

<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="namingStrategy" ref="namingStrategy"/>
<property name="assembler" ref="assembler"/>
<property name="beans">
<map>
<entry key="bean:name=customerBean" value-ref="customerBean"/>
</map>
</property>
</bean>

<bean id="customerBean" class="domain.Contact">
<property name="firstName" value="Harry"/>
<property name="lastName" value="Potter"/>
</bean>

<bean id="attributeSource" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>

<bean id="assembler" class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
<property name="attributeSource" ref="attributeSource"/>
</bean>

<bean id="namingStrategy" class="org.springframework.jmx.export.naming.MetadataNamingStrategy">
<property name="attributeSource" ref="attributeSource"/>
</bean>

 

Теперь мы можем конкретно указать, какие атрибуты выставлять. В объекте домена «Контакт» аннотируйте два метода, которые получают имя и фамилию:

@ManagedAttribute()
public String getFirstName() {
return firstName;
}


@ManagedAttribute()
public String getLastName() {
return lastName;
}

 

Примечание: Раздел 20.3.2 вышеупомянутого справочного документа дает здесь некоторую интересную информацию: «Вы также заметите, что свойства
age и
name помечены атрибутом ManagedAttribute , но в случае свойства age помечается только метод получения. Это приведет к тому, что оба эти свойства будут включены в интерфейс управления в качестве атрибутов, но атрибут age будет доступен только для чтения ». Другими словами, если вы такжеаннотируйте установщики, тогда атрибуты будут доступны для записи в Java VisualVM. Также прочитайте документ об Уведомлениях (раздел 20.7), который также может быть реализован в контексте Spring Rich Clients.

Запустите приложение еще раз, и Java VisualVM будет более разборчивым в отношении данных, которые оно предоставляет:

Если бы вы также аннотировали один или оба установщика, шрифт атрибута был бы синим в Java VisualVM, и вы могли бы редактировать его значение:

Тем не менее, VisualVM до сих пор не доказал свою ценность. Мы могли бы просто использовать вместо этого JConsole. Итак, давайте теперь создадим плагин VisualVM специально для нашего приложения Spring Rich Client. После того, как мы установили плагин в VisualVM, мы создадим функциональность специально для нашего приложения, чтобы с этого момента мы могли визуально контролировать его простым и интуитивно понятным способом:

На самом деле, нам даже не понадобится плагин MBeans. Ниже вы видите, что нет вкладки MBeans, хотя атрибуты JMX отображаются в виде проводника:

Как видите, мы позволим Java VisualVM распознавать наше демонстрационное приложение Spring как отличное от всех других приложений. Специальный значок и отображаемое имя будут отображаться в окне обозревателя при каждом запуске демонстрации Spring. Кроме того, его атрибуты будут отображаться в обозревателе, чтобы мы могли сразу же увидеть их.

В следующем разделе будет объяснено, как просто создать плагин, который обеспечивает вышеуказанную функциональность. Но насколько это полезно на самом деле? Что ж, вы могли бы расширить его еще больше и вместо имени и типа атрибута также показать текущее значение, что может быть особенно полезно при визуализации приложения, которое вы отслеживаете:

 

Создание плагина VisualVM для демонстрации Simple Spring

В этом разделе мы создадим плагин, который изменяет VisualVM таким образом, что он распознает наше демонстрационное приложение Spring.

Способ, которым VisualVM распознает приложение, — через его основной класс.

Когда VisualVM запущен и приложение запускается с основным классом, указанным нашим плагином, VisualVM предоставит значок и отображаемое имя специально для нашего приложения, а также подузлы для каждого из атрибутов, которые мы сделали доступными с помощью нашего Spring-driven Бин JMX.

Мы начнем все это через шаблон, который является частью VisualVM Sample Collection 1.0 . Так перейдите на страницу коллекции образца , загрузите его и установите его в IDE NetBeans 6.1.

  1. Откройте мастер создания проекта в IDE и выберите образец «Подузлы обозревателя», который мы будем использовать в качестве нашего шаблона:

  2.  

  3. После завершения работы мастера у вас будет проект с сообщениями об ошибках, потому что вы не установили платформу плагина. Платформа предоставляет все модули, которые предоставляют API, используемые плагином. Теперь, когда VisualVM является частью JDK, просто получить необходимую платформу:

     

  4. Теперь, когда вы зарегистрировали свою платформу, установите VisualVM в качестве платформы для плагина, над которым вы работаете:

     

  5. Теперь мы собираемся выполнить некоторые небольшие настройки, которые будут настраивать шаблон в соответствии с нашими потребностями. В конце концов, вместо приложения Anagram Game, для которого оно было сделано, теперь оно должно быть адаптировано для работы с демонстрационным приложением Spring. По желанию, вы можете изменить рефакторинг всех имен классов, чтобы «Анаграмма» больше не упоминалась. Но давайте сделаем только самое необходимое:

       

    • Open org.visualvm.demoapplicationtype.applicationtype.AnagramApplicationTypeFactory. In this class the «createApplicationTypeFor» method specifies which application will be handled by our plugin. That, in turn, is determined by the main class of the application, which in our case is «app.SimpleApp» (assuming you’re working with the Spring demo that comes with the Spring RCP Tooling plugin from the NetBeans Plugin Portal). So change that method and ensure that the application’s main class is referred to in line 3 below:
      @Override
      public ApplicationType createApplicationTypeFor(Application app, Jvm jvm, String mainClass) {
      if ("app.SimpleApp".equals(mainClass)) {
      return new AnagramApplicationType(app.getPid());
      }
      return null;
      }

       

    • Откройте org.visualvm.demoapplicationtype.application.AnagramApplicationProvider. Здесь находится информация, связанная с JMX. В «DiscoveryTask.onSchedule» убедитесь, что для подключения к серверу JMX используется то же имя объекта, что и имя объекта, которое вы определили ранее в объекте домена «Контакт».

      ObjectName obj = new ObjectName("app.SimpleApp:type=SpringDemo");
    •  

    • Откройте org.visualvm.demoapplicationtype.applicationtype.AnagramApplicationType. В методе «getName ()» измените отображаемое имя на «Spring Simple Demo» (или все, что вы хотели бы отображать в представлении проводника). Здесь также можно изменить значок, используя метод «getIcon».

     

  6. Установите плагин и запустите демонстрационное приложение Spring. Приложение теперь должно распознаваться как отдельное приложение, поскольку отображаемое имя и значок должны измениться на значения, указанные вами выше. Если вы установите плагин MBeans в VisualVM, вы сможете просмотреть информацию о JMX. Независимо от того, делаете вы это или нет, вы можете развернуть узел «Атрибуты» в представлении проводника и, таким образом, увидеть атрибуты, предоставляемые приложением через JMX:

 

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

 

Дальнейшее чтение: