我想从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
,其中包含以下内容为了我:
<typedefname="open"classname="org.apache.catalina.ant.jmx.JMXAccessorTask" />
<typedefname="set"classname="org.apache.catalina.ant.jmx.JMXAccessorSetTask" />
<typedefname="get"classname="org.apache.catalina.ant.jmx.JMXAccessorGetTask" />
<typedefname="invoke"classname="org.apache.catalina.ant.jmx.JMXAccessorInvokeTask" />
<typedefname="query"classname="org.apache.catalina.ant.jmx.JMXAccessorQueryTask" />
<typedefname="create"classname="org.apache.catalina.ant.jmx.JMXAccessorCreateTask" />
<typedefname="unregister"classname="org.apache.catalina.ant.jmx.JMXAccessorUnregisterTask" />
<typedefname="equals"classname="org.apache.catalina.ant.jmx.JMXAccessorEqualsCondition" />
<typedefname="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" /><jmxQueryhost="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" /><jmxOpenhost="localhost"port="8686"ref="glassfish"failOnError="true" /><jmxInvokename="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