Я хотел вызвать операции JMX из задач Ant. Однако найти пригодную для использования библиотеку задач муравья и ее использование было довольно сложно. Поэтому позвольте мне поделиться своим опытом, чтобы облегчить жизнь другим.
Задачи Ant для операций JMX
Я решил следовать документации Tomcat и использовал задачи Ant, распространяемые вместе с tomcat.
Просто для записи, использование не ограничено Tomcat развернутым mMeans JMX . Для меня это работает для процесса Java, доступного через JConsole через удаленное соединение.
Извлечение библиотеки
- Поскольку я хотел получить последнюю версию, я использовал функцию «поиск по имени класса» в центральном репозитории maven и искал:
org.apache.catalina.ant.jmx.JMXAccessorTask
(см. Запрос ) - после этого я отправился на файл jar tomcat 8 (называемый
tomcat-catalina-ant-8.0.8.jar
) - и просто скопировал последнюю версию, доступную для моего
$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
Вот двухэтапный подход:
- подключиться к удаленному серверу через JMX и впоследствии
- вызвать операцию на конкретном 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 о жизни и ИТ- блоге. |