我从StackOverflow上收集了信息,并根据其他成员的提示找到了这些信息。
JMX带来的大部分痛苦(在我看来)是JMX打开了第二个动态分配的网络端口。如防火墙(例如iptables)会阻止此端口。
适用于Linux上的Tomcat的解决方案:
使用Tomcat 6.0.24或更新版本
从Apache Tomcat Extras下载catalina-jmx-remote.jar(在Tomcat下载页面上使用浏览器)
将其复制到$CTALINA_HOME\lib中
这样可以设置JMX使用的两个端口
编辑server.xml中的Server部分
<Server port="8005" ..>
...
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>
设置一些环境变量(例如在setenv.sh中)
CATALINA_OPTS="
-Djava.rmi.server.hostname=IP-TO-LISTEN
-Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access
-Dcom.sun.management.jmxremote.ssl=false"
这将激活JMX的访问控制。
jmxremote.access会如下所示
monitorRole readonly
controlRole readwrite
将结束 jmxremote.password
monitorRole tomcat
controlRole tomcat
(只是简单的空格)
重新启动Tomcat。
现在在服务器上配置防火墙(例如iptables)。
/etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT
还有 /etc/sysconfig/ip6tables
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT
重启iptables。
完成!
现在使用VisualVM或JConsole连接到rmiRegistryPortPlatform,我们的示例中为9840。
如果工作站和服务器之间没有更多的防火墙,则应该可以正常工作。