ActiveMQ小记(一):监控

初衷:介绍ActiveMQ的监控,便于之后温故

1. 搭建

建议自己clone github https://github.com/apache/activemq 下来,然后编译,打包,方便以后进行改造

网上很多关于之类的demo,本文不再赘述,详情可参考:http://my.oschina.net/Auhgnahz/blog/551620?fromerr=o3purd6Y

2. 监控管理

一般,公司都希望对一些数据,程序监控,才能上生产,而ActiveMQ的监控无非是如下几部分:

1)监控硬件物理空间是否充足

- ActiveMQ有3个重要的参数,存储空间百分比,内存空间百分比和临时空间百分比。这三个参数的意义很明显,如果值到了100,则表明硬件空间已满,Broker不能再接受任何的消息了,除非有消息消费并且删除,Broker才可以再接收消息。

- 如果这些值长时间都比较高,接近阀值,则表示硬件的配置不能满足要求,建议更换硬件,或者给予ActiveMQ的环境配置比较小,建议给予更多的资源给ActiveMQ。

- 如果平时保持在一个稳定值,有一段时间突然增高,则有两种可能。一种可能是用户量大增,另一种可能是某个或者某几个消息消费者死机了。需要人工干预重启。

2)监控队列

- 如果ActiveMQ使用队列,需要监控队列的未消费消息数量,消费者数量,消息入队和出队的数量

- 未消费消息数量的含义和监控硬件的内存和硬盘空间差不多,过多的消息堆积可能是有消息消费者死机

- 消费者数量应该是一个相对固定的值,这个值减少,就直接表示有的消费者已经死机

- 消息入队和出队数量如果增长缓慢或者不增长,则表示消息发送者已经死机。一般是通过增量监控

3)监控主题

如果ActiveMQ使用主题,需要监控的内容和队列相似,但是没有未消费的消息数量。这里指的注意的是,ActiveMQ提供Advisory Message,用于帮助使用统计一些额外信息,具体可查看官方文档:http://activemq.apache.org/advisory-message.html

4)监控订阅者 

- 同样,如果ActiveMQ使用主题,订阅者的信息就十分重要。需要监控已经下线的订阅者。


如下是ActiveMQ的展示页面:

ActiveMQ小记(一):监控_第1张图片


第一步:修改activemq.xml

修改conf目录下的activemq.xml文件,大概在70行左右,开启managementContext


    

建议:jmxDomainName以默认配置,否则,./activemq stop将关闭不了,如下图:


详见:https://issues.apache.org/jira/browse/AMQ-3082

或者使用嵌入式Broker,详情见: http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html


第二步:创建JMXConnector

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







你可能感兴趣的:(ActiveMQ)