ActiveMQ的特性之一是很好的支持JMX。通过JMX MBeans可以很方便的监听和控制ActiveMQ的broker。
鉴于官方网站提供的JMX特性说明对于远程访问的配置流程不是很完整,笔者在实际配置时也走了一点弯路。所以本文将根据笔者的实际经验,分别讲解如何在windows和Linux环境下配置ActiveMQ的JMX远程访问。除此之外,还会从“是否是密码保护”的方面讲解。
本文的JMX客户端环境为Windows7下的JDK1.7。
没有密码保护的远程访问
没有密码保护的远程访问的配置很简单,只需稍微修改activemq.xml中的配置即可。配置如下:
Window平台下
在<broker>节点中加入useJmx属性,并修改<managementContext>节点中的createConnector属性:
<broker ... useJmx="true"> ... <managementContext> <managementContext createConnector="true"/> </managementContext> </broker>
其中,默认访问端口为1099,也可以通过<managementContext>节点中的connectorPort属性修改。启动activemq后,日志中出现以下信息表示配置成功了。
INFO | JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
在windows7命令行中启动jconsole,选择“远程进程”,在URL中输入将localhost替换成实际IP后的上述信息,无需用户名和口令。即可链接成功。如图:
Linux平台下
Lunix平台的下配置与windows如出一辙,但需额外增加如下配置:
<broker ... useJmx="true"> ... <managementContext> <managementContext createConnector="true" connectorHost="本机的IP"/> </managementContext> </broker>
或修改Linux服务器系统文件/etc/hosts中的localhost设置,将127.0.0.1更改为实际IP(不建议)。
否则客户端无法通过将localhost替换成实际IP后远程访问JMX。
有密码保护的远程访问
有密码保护的配置相对较复杂,需要修改JVM参数,主要步骤如下:
Window平台下
一、确认ActiveMQ默认的连接器已经关闭。注意createConnector=false
<broker ... useJmx="true"> ... <managementContext> <managementContext createConnector="false"/> </managementContext> </broker>
二、确认conf目录下有jmx.access(用户权限)和jmx.password(用户密码)两个文件(安装时默认会有),并按照格式填写内容(参考官方文档)
三、修改jmx.password的读取权限,目的是除归属用户外,其它用户不能有权限读写,这个是难点,对于笔者使用的win7系统,按如下方式修改。
右键jmx.password文件>属性>安全>高级>权限,将“包括可从该对象的父项继承的权限”勾掉,弹出警告选择“添加”
然后删除所有用户,一路确定。此时这个文件已经不能访问和修改。若想重新修改内容,右键jmx.password文件>属性>安全>高级>权限>添加,将用户添加进来即可。
四、修改bin\activemq.bat文件。找到set SUNJMX=语句处,主要不是带REM(注释掉)的那一行将SUNJMX值设置为
set SUNJMX=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1616 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=%ACTIVEMQ_BASE%/conf/jmx.password -Dcom.sun.management.jmxremote.access.file=%ACTIVEMQ_BASE%/conf/jmx.access
好了,现在通过jconsole远程链接,填写URL,注意端口为1616,输入用户名密码,连接成功。
关于winxp及其它细节,参考http://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html#PasswordAccessFiles,和How to a Secure Password File on Microsoft Windows Systems。
Linux平台下
Linux下的步骤与windows类似:
一、设置createConnector=false
二、确认jmx.access和jmx.password两个文件和内容
三、关于jmx.password文件的权限,Linux下就比较容易,执行以下命令即可
chmod 600 jmxremote.password
四、修改bin\activemq文件,将以下4行注释放开。注意,这里不是SUNJMX,不与windows一样。
# ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=11099" # ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password" # ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access" # ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"
现在,Linux平台下也可以实现有密码保护的远程访问了。
总结
关于JMX远程访问的配置已全部讲解完毕,总结一下我们主要进行的配置:
不需要密码时,只修改activemq.xml中的配置即可;
需要密码时,关掉默认链接,在脚本中修改JVM参数,引向密码文件。难点在于密码文件的权限修改。