Tomcat 监控与管理- tomcat教程 - 极悦

Tomcat教程

全部教程

×

Tomcat监控与管理

omcat监控与管理简介

监控是系统管理中的重要环节。系统管理员的日常工作就包括:观察服务器的运行细节,获取统计数据,或者重新配置应用的某些内容。

启用 JMX 远程监控

注意:该配置只适用于需用远程监控 Tomcat 的情况,使用同样的用户在本地监控 Tomcat 则不需要这么配置。

Oracle 的网站上介绍了如何在 Java 6 上配置 JMX 远程:http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html。

下面是在 Java 6 上的快速配置向导:

将下列参数添加到 Tomcat 的 setenv.bat 脚本(具体详细信息请查看 RUNNING.txt)。

注意:该语法格式适用于 Windows 系统。命令行只能写在同一行中,包装起来更具可读性。如果 Tomcat 以 Windows 服务的形式运行,使用它的系统配置对话设置该服务的 java 选项。对于 UN\*X 系统来说,要将命令行开头的 "set " 去掉。

set CATALINA_OPTS=-Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=%my.jmx.port%
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false

1.如果需要授权,则添加并修改下列命令:

-Dcom.sun.management.jmxremote.authenticate=
true-Dcom.sun.management.jmxremote.password.file
=../conf/jmxremote.password-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access

2.编辑访问权限文件 $CATALINA_BASE/conf/jmxremote.access:

monitorRole readonly
controlRole readwrite

3.编辑密码文件 $CATALINA_BASE/conf/jmxremote.password:

monitorRole tomcat
controlRole tomcat

技巧:密码文件应该是只读的,并且只能被运行 Tomcat 的操作系统用户所访问。

注意:JSR 160 JMX 适配器在一个随机端口上打开了第二个数据通道。假如本地安装了防火墙,这就会出现问题。要想解决它,可以按照侦听器文档中介绍的方法,配置一个 JmxRemoteLifecycleListener。

利用 JMX 远程 Ant 任务来管理 Tomcat

为了简化 JMX 的用法,加入了一些可能会与 antlib 使用的一系列任务。

antlib:将 catalina-ant.jar 从 $CATALINA_HOME/lib 复制到 $ANT_HOME/lib。

下面的例子展示了 JMX 存储器的用法。

注意:为了提高可读性,这里将 name 属性值予以包装。它必须写在同一行中,不允许带有空格。

<project name="Catalina Ant JMX"
      xmlns:jmx="antlib:org.apache.catalina.ant.jmx"
      default="state"
      basedir=".">
  <property name="jmx.server.name" value="localhost" />
  <property name="jmx.server.port" value="9012" />
  <property name="cluster.server.address" value="192.168.1.75" />
  <property name="cluster.server.port" value="9025" />

  <target name="state" description="Show JMX Cluster state">
    <jmx:open
      host="${jmx.server.name}"
      port="${jmx.server.port}"
      username="controlRole"
      password="tomcat"/>
    <jmx:get
      name="Catalina:type=IDataSender,host=localhost,
senderAddress=${cluster.server.address},senderPort=${cluster.server.port}"
      attribute="connected"
      resultproperty="IDataSender.backup.connected"
      echo="false"
    />
    <jmx:get
      name="Catalina:type=ClusterSender,host=localhost"
      attribute="senderObjectNames"
      resultproperty="senderObjectNames"
      echo="false"
    />
    <!-- get current maxActiveSession from ClusterTest application
       echo it to Ant output and store at
       property <em>clustertest.maxActiveSessions.orginal</em>
    -->
    <jmx:get
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      attribute="maxActiveSessions"
      resultproperty="clustertest.maxActiveSessions.orginal"
      echo="true"
    />
    <!-- set maxActiveSession to 100
    -->
    <jmx:set
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      attribute="maxActiveSessions"
      value="100"
      type="int"
    />
    <!-- get all sessions and split result as delimiter <em>SPACE</em> for easy
       access all session ids directly with Ant property sessions.[0..n].
    -->
    <jmx:invoke
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      operation="listSessionIds"
      resultproperty="sessions"
      echo="false"
      delimiter=" "
    />
    <!-- Access session attribute <em>Hello</em> from first session.
    -->
    <jmx:invoke
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      operation="getSessionAttribute"
      resultproperty="Hello"
      echo="false"
    >
      <arg value="${sessions.0}"/>
      <arg value="Hello"/>
    </jmx:invoke>
    <!-- Query for all application manager.of the server from all hosts
       and bind all attributes from all found manager MBeans.
    -->
    <jmx:query
      name="Catalina:type=Manager,*"
      resultproperty="manager"
      echo="true"
      attributebinding="true"
    />
    <!-- echo the create properties --><echo>
senderObjectNames: ${senderObjectNames.0}
IDataSender.backup.connected: ${IDataSender.backup.connected}
session: ${sessions.0}
manager.length: ${manager.length}
manager.0.name: ${manager.0.name}
manager.1.name: ${manager.1.name}
hello: ${Hello}
manager.ClusterTest.0.name: ${manager.ClusterTest.0.name}
manager.ClusterTest.0.activeSessions: ${manager.ClusterTest.0.activeSessions}
manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED:
 ${manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED}
manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS:
 ${manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS}</echo>

  </target>
</project>
导入:利用  导入 JMX 存取器项目,利用 jmxOpen、jmxSet、jmxGet、jmxQuery、jmxInvoke、jmxEquals 和 jmxCondition 来引用任务。