監控是系統管理中的重要環節。系統管理員的日常工作就包括:觀察服務器的運行細節,獲取統計數據,或者重新配置應用的某些內容。
注意:該配置只適用于需用遠程監控 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 的用法,加入了一些可能會與 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 來引用任務。