Статьи

Задачи Apache Ant для доступа к JMX

Я хотел вызвать операции JMX из задач Ant. Однако найти пригодную для использования библиотеку задач муравья и ее использование было довольно сложно. Поэтому позвольте мне поделиться своим опытом, чтобы облегчить жизнь другим.

Задачи Ant для операций JMX

Я решил следовать документации Tomcat и использовал задачи Ant, распространяемые вместе с tomcat.

Просто для записи, использование не ограничено Tomcat развернутым mMeans JMX . Для меня это работает для процесса Java, доступного через JConsole через удаленное соединение.

Извлечение библиотеки

  1. Поскольку я хотел получить последнюю версию, я использовал функцию «поиск по имени класса» в центральном репозитории maven и искал: org.apache.catalina.ant.jmx.JMXAccessorTask (см. Запрос )
  2. после этого я отправился на файл jar tomcat 8 (называемый tomcat-catalina-ant-8.0.8.jar )
  3. и просто скопировал последнюю версию, доступную для моего $ANT_HOME/lib .

использование

У меня не было возможности (или мотивации?) Проверить все доступные задачи, полный список доступных задач можно увидеть в архивном файле: org/apache/catalina/ant/jmx/antlib.xml , присутствовали следующие для меня:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<typedef
    name="open"
    classname="org.apache.catalina.ant.jmx.JMXAccessorTask" />
<typedef
    name="set"
    classname="org.apache.catalina.ant.jmx.JMXAccessorSetTask" />
<typedef
    name="get"
    classname="org.apache.catalina.ant.jmx.JMXAccessorGetTask" />
<typedef
    name="invoke"
    classname="org.apache.catalina.ant.jmx.JMXAccessorInvokeTask" />
<typedef
    name="query"
    classname="org.apache.catalina.ant.jmx.JMXAccessorQueryTask" />
<typedef
    name="create"
    classname="org.apache.catalina.ant.jmx.JMXAccessorCreateTask" />
<typedef
    name="unregister"
    classname="org.apache.catalina.ant.jmx.JMXAccessorUnregisterTask" />
<typedef
    name="equals"
    classname="org.apache.catalina.ant.jmx.JMXAccessorEqualsCondition" />
<typedef
    name="condition"
    classname="org.apache.catalina.ant.jmx.JMXAccessorCondition" />

из них я дал следующую попытку:

1
2
3
org.apache.catalina.ant.jmx.JMXAccessorTask
org.apache.catalina.ant.jmx.JMXAccessorInvokeTask
org.apache.catalina.ant.jmx.JMXAccessorQueryTask

Для демонстрации я использую Glassfish 4.0.

Пример: перечисление JMX MBeans

Давайте предположим, что мы хотим получить MBean по имени (а именно: java.lang:type=Memory ). Обратите внимание, что имя пользователя и пароль не были необходимы для доступа (в противном случае они должны быть указаны через соответствующие свойства).

Заслуживает внимания resultproperty , которое может содержать массив, из которого мы можем получить имя. Итак, имея в сборке муравей сценарий:

01
02
03
04
05
06
07
08
09
10
11
12
13
<typedef
    name="jmxQuery"
    classname="org.apache.catalina.ant.jmx.JMXAccessorQueryTask" />
 
<jmxQuery
    host="localhost"
    port="8686"
    echo="true"
    name="java.lang:type=Memory"
    resultproperty="memory" />
 
<echo>Retrieved MBeans count: ${memory.Length}</echo>
<echo>The 1.st one has name: ${memory.0.Name}</echo>

результаты для меня в следующем выводе:

1
2
3
4
[jmxQuery] memory.Length=1
 [jmxQuery] memory.0.Name=java.lang:type=Memory
     [echo] Retrieved MBeans count: 1
     [echo] The 1.st one has name: java.lang:type=Memory

Пример: вызов операции через JMX

Вот двухэтапный подход:

  1. подключиться к удаленному серверу через JMX и впоследствии
  2. вызвать операцию на конкретном MBean.

Для демонстрации, давайте предположим, что мы хотим вызвать сборку мусора (с помощью вызова операции: gc() для MBean с именем: java.lang:type=Memory )

Примерный файл Ant ant build выполняет свою работу (обратите внимание, что значение свойства ref должно быть одинаковым для этих двух задач):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<typedef
    name="jmxOpen"
    classname="org.apache.catalina.ant.jmx.JMXAccessorTask" />
 
<typedef
    name="jmxInvoke"
    classname="org.apache.catalina.ant.jmx.JMXAccessorInvokeTask" />
 
<jmxOpen
    host="localhost"
    port="8686"
    ref="glassfish"
    failOnError="true" />
 
<jmxInvoke
    name="java.lang:type=Memory"
    operation="gc"
    echo="true"
    delimiter=" "
    failOnError="true"
    ref="glassfish" />

Дальнейшая информация

Для получения более подробной информации, я рекомендую прочитать официальную документацию Tomcat, а также Javadocs .

Ссылка: Задачи Apache Ant для доступа к JMX от нашего партнера JCG Питера Бутковича из блога pb о жизни и ИТ- блоге.