当前位置: 首页 > 工具软件 > JMX4Ant > 使用案例 >

用于JMX访问的Apache Ant任务

乐正锦
2023-12-01

我想从Ant任务中调用JMX操作。 但是,找到可用的蚂蚁任务库及其用法非常棘手。 因此,让我分享我的经验,使他人更轻松。

JMX操作的Ant任务

我决定遵循Tomcat文档并使用与tomcat一起分发的ant任务。

仅作记录用途,并不限于Tomcat部署的JMX mBean 。 对我来说,它适用于通过远程连接通过JConsole访问的Java进程。

检索图书馆

  1. 当我想获取最新版本时,我使用了maven中央存储库“按类名搜索”功能并搜索: org.apache.catalina.ant.jmx.JMXAccessorTask (请参阅查询
  2. 之后,我去了tomcat 8 jar文件 (称为tomcat-catalina-ant-8.0.8.jar
  3. 并将最新的可用版本复制到我的$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调用操作

这是所需的两步方法:

  1. 之后通过JMX连接到远程服务器
  2. 在特定的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

 类似资料: