准备工作:
activemq-5.90安装包 下载地址:http://activemq.apache.org/download-archives.html
安装步骤请参考:http://blog.csdn.net/qq_29447481/article/details/72901969
在搭建好activemq-5.90集群后,对activemq进行jmx监控设置:
第一步:
修改conf/activemq.xml配置文件
找到<broker处,在后面添加 上 useJmx="true"
找到createConnector="false"将false修改为true,同时添加上connectorPort=“jmx端口号(一般是11099)” connectorHost=“本机ip地址"
修改完后的效果图如下
<broker … useJmx="true">
<managementContext>
<managementContext createConnector="true" connectorPort=“jmx端口号” connectorHost=“本机ip地址" />
</managementContext>
</broker>
第二步:设置jmx.access、jmx.password的文件权限(为了安全考虑将这两个文件设置为只读)
chmod 400 conf/jmx.*
第三步:
修改bin\activemq 启动shell脚本(如果是activemq-5.9版本的,先进去看一下是否有这段,没有的话再插入,我配置时发现activemq-5.9版本的里面有这段)找到invoke_start(){ 这段,然后在前面插入:(注意是在这段上面插入,不是在这段里面的前面插入)
ACTIVEMQ_CONF=“jmx.password所在位置的物理路目录"
ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=端口号 "
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"
这些配置都配置完成后重启activemq即可
测试:
在jconsole中进行测试,jconsole.exe程序在本机安装的jdk下的bin文件下
双击启动程序后会出现如下页面:
在远程进程这块写入ip地址,用户名和密码可以在activemq安装目录下的conf/jmx.password中查看,一般默认用户名是:admin 密码:activemq
登录成功后看到如下视图即为配置成功
activemq的jmx监控配置成功之后,通过java代码来获取jmx的监控信息
String jmxurl = "service:jmx:rmi:///jndi/rmi://IP地址:11099/jmxrmi"; //访问的监控地址
String userName = "admin";
String userPwd = "activemq";
String objectName = "org.apache.activemq:brokerName=localhost,type=Broker" //objectName可以在jconsole中查到
Map<String, String[]> iden = new HashMap<>();
String[] credentials = {userName, userPwd}; iden.put(JMXConnector.CREDENTIALS, credentials);
JMXServiceURL url = new JMXServiceURL(jmxurl);
JMXConnector jmxc = JMXConnectorFactory.connect(url, iden);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
ObjectName objRootName = new ObjectName(objectName);
String brokerName = (String) conn.getAttribute(objRootName, "BrokerName");
String brokerId = (String) conn.getAttribute(objRootName, "BrokerId");
String openWireUrl = (String) conn.getAttribute(objRootName, "OpenWireURL");
System.out.println(brokeName+brokeId+openWireUrl)
//遍历队列
ObjectName[] objectNames = (ObjectName[]) conn.getAttribute(objRootName, "Queues");
List<String> blackList = monitorConfig.getQueueBlackList();
for (ObjectName queueName : objectNames) {
//注意此处的类型要和jconsole中监控的类型一样
Long queueSize = (Long) conn.getAttribute(queueName, "QueueSize");//队列消息数量
Long producerCount = (Long) conn.getAttribute(queueName, "ProducerCount");//生产者数量
Long consumerCount = (Long) conn.getAttribute(queueName, "ConsumerCount");//消费者数量
Long enqueueCount = (Long) conn.getAttribute(queueName, "EnqueueCount");//入队消息总数
Long dequeueCount = (Long) conn.getAttribute(queueName, "DequeueCount");//出队消息总数
System.out.println(queueSize+produceCount+consumerCount+enqueueCount+dequeueCount)
}
参考博客:http://www.cnblogs.com/yjmyzz/p/active-mq-jmx-monitor.html