我想从Ant任务中调用JMX操作。 但是,找到可用的蚂蚁任务库及其用法非常棘手。 因此,让我分享我的经验,使他人更轻松。
JMX操作的Ant任务
我决定遵循Tomcat文档并使用与tomcat一起分发的ant任务。
仅作记录用途,并不限于Tomcat部署的JMX mBean 。 对我来说,它适用于通过远程连接通过JConsole访问的Java进程。
检索图书馆
- 当我想获取最新版本时,我使用了maven中央存储库“按类名搜索”功能并搜索:
org.apache.catalina.ant.jmx.JMXAccessorTask
(请参阅查询 ) - 之后,我去了tomcat 8 jar文件 (称为
tomcat-catalina-ant-8.0.8.jar
) - 并将最新的可用版本复制到我的
$ANT_HOME/lib
目录中。
用法
我没有机会(或动机?)检查所有可用任务,可以在压缩文件中查看可用任务的完整列表: org/apache/catalina/ant/jmx/antlib.xml
,其中包含以下内容为了我:
<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" />
其中,我尝试了以下方法:
org.apache.catalina.ant.jmx.JMXAccessorTask
org.apache.catalina.ant.jmx.JMXAccessorInvokeTask
org.apache.catalina.ant.jmx.JMXAccessorQueryTask
出于演示目的,我使用了Glassfish 4.0。
示例:列出JMX MBean
假设我们要按名称检索MBean(即: java.lang:type=Memory
)。 请注意,访问不需要输入用户名和密码(否则应通过相应的属性指定)。
这里值得注意的是resultproperty
,它可以保存我们可以从中获得名称的数组。 因此,在ant构建脚本中:
<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>
结果对我来说如下输出:
[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上调用操作。
出于演示目的,假设我们要调用垃圾回收(通过在名为: java.lang:type=Memory
MBean上调用操作: gc()
)
样本ant构建文件块完成了该工作(请注意这两个任务之间的ref
属性值必须相同):
<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 。
翻译自: https://www.javacodegeeks.com/2014/06/apache-ant-tasks-for-jmx-access.html