初衷:介绍ActiveMQ的监控,便于之后温故
建议自己clone github https://github.com/apache/activemq 下来,然后编译,打包,方便以后进行改造
网上很多关于之类的demo,本文不再赘述,详情可参考:http://my.oschina.net/Auhgnahz/blog/551620?fromerr=o3purd6Y
一般,公司都希望对一些数据,程序监控,才能上生产,而ActiveMQ的监控无非是如下几部分:
- ActiveMQ有3个重要的参数,存储空间百分比,内存空间百分比和临时空间百分比。这三个参数的意义很明显,如果值到了100,则表明硬件空间已满,Broker不能再接受任何的消息了,除非有消息消费并且删除,Broker才可以再接收消息。
- 如果这些值长时间都比较高,接近阀值,则表示硬件的配置不能满足要求,建议更换硬件,或者给予ActiveMQ的环境配置比较小,建议给予更多的资源给ActiveMQ。
- 如果平时保持在一个稳定值,有一段时间突然增高,则有两种可能。一种可能是用户量大增,另一种可能是某个或者某几个消息消费者死机了。需要人工干预重启。
- 如果ActiveMQ使用队列,需要监控队列的未消费消息数量,消费者数量,消息入队和出队的数量
- 未消费消息数量的含义和监控硬件的内存和硬盘空间差不多,过多的消息堆积可能是有消息消费者死机
- 消费者数量应该是一个相对固定的值,这个值减少,就直接表示有的消费者已经死机
- 消息入队和出队数量如果增长缓慢或者不增长,则表示消息发送者已经死机。一般是通过增量监控
如果ActiveMQ使用主题,需要监控的内容和队列相似,但是没有未消费的消息数量。这里指的注意的是,ActiveMQ提供Advisory Message,用于帮助使用统计一些额外信息,具体可查看官方文档:http://activemq.apache.org/advisory-message.html
- 同样,如果ActiveMQ使用主题,订阅者的信息就十分重要。需要监控已经下线的订阅者。
如下是ActiveMQ的展示页面:
第一步:修改activemq.xml
修改conf目录下的activemq.xml文件,大概在70行左右,开启managementContext
详见:https://issues.apache.org/jira/browse/AMQ-3082
或者使用嵌入式Broker,详情见: http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html
public class StateMonitor {
private static final String connectorPort = "1099";
private static final String connectorPath = "/jmxrmi";
private static final String jmxDomain = "jmx-domain";// 必须与activemq.xml中的jmxDomainName一致
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + connectorPort + connectorPath);
JMXConnector connector = JMXConnectorFactory.connect(url);
connector.connect();
MBeanServerConnection connection = connector.getMBeanServerConnection();
ObjectName name = new ObjectName(jmxDomain + ":brokerName=localhost,type=Broker");
BrokerViewMBean mBean = MBeanServerInvocationHandler.newProxyInstance(connection, name, BrokerViewMBean.class, true);
for (ObjectName queueName : mBean.getQueues()) {
QueueViewMBean queueMBean = MBeanServerInvocationHandler.newProxyInstance(connection, queueName, QueueViewMBean.class, true);
System.out.println("\n------------------------------\n");
// 消息队列名称
System.out.println("Queue Name --- " + queueMBean.getName());
// 队列中剩余的消息数
System.out.println("Queue Size --- " + queueMBean.getQueueSize());
// 消费者数
System.out.println("Number of Consumers --- " + queueMBean.getConsumerCount());
// 出队数
System.out.println("Number of Dequeue ---" + queueMBean.getDequeueCount());
}
}
}
一般可通过mBean获取所需要的监控信息!!!
此案例,只是一个简单的配置,要是上生产,则需要修改,进行实时的监控,可参考:https://github.com/liaomengge/spring-activemq
附:ActiveMQ常用的几个命令
activemq list --- 列出当前Broker名字
activemq bstat --- 显示当前Broker的统计信息
activemq browse --- 可以查询当前Broker为被消费的消息,会显示消息的详细信息,如消息头,消息内容,优先级等
activemq dstat ---可以用来查询队列的关键数值,如队列大小,生产者消费者数量,消息出队入队统计等。还可以支持通过类别查询,如只查询队列或者只查询主题
activemq console --- 以控制台启动activemq,便于查看启动的详情
参考文章:
http://www.tuicool.com/articles/ammUNn
http://my.oschina.net/jinghaichao/blog/57318?fromerr=0KwRYEGf
http://activemq.apache.org/jmx.html