ActiveMQ实践系列1——远程监控

Posted zryouchin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveMQ实践系列1——远程监控相关的知识,希望对你有一定的参考价值。

近期项目中应用到了ActiveMQ,本次和大家分享下ActiveMQ的远程监控,希望对大家有帮助。

情景

因某需求,需要获取一个队列(Queue)下有几个消费者,及每个消费者的使用情况。

折腾过程

找了很久没找到资料,后来发现官方提供的管理界面上有类似功能,真是踏破铁鞋无觅处,问题搞定了哈哈哈

技术分享图片

然而……我需要是获取消费者的代码,光有界面有个毛用;然后我想到官方既然提供了界面,那肯定也是个web工程;就在安装目录下有个webapps的项目,就是管理界面的web工程。

技术分享图片

导入web项目一番寻找后,终于锁定了一个类RemoteJMXBrokerFacade,能够获取某个队列下的消费者情况。

核心代码

1.引入依赖

springboot如何整合activemq的不说明了,不懂的童鞋请自行百度哈。

RemoteJMXBrokerFacade类需要引入activemq-web包,但是此包依赖了一大堆其他的东东,用<exclusions>排除掉就可以了。

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-continuation</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.eclipse.jetty.websocket</groupId>
            <artifactId>websocket-server</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. ActiveMQ配置

在安装目录的conf路径下找到activemq.xml

技术分享图片

打开文件,找到managementContext并修改为true;看注释的意思应该就是暴露一个JMX端口来监控ActiveMQ,默认端口1099

<!--
    The managementContext is used to configure how ActiveMQ is exposed in
    JMX. By default, ActiveMQ uses the MBean server that is started by
    the JVM. For more information, see:

    http://activemq.apache.org/jmx.html
-->
<managementContext>
    <managementContext createConnector="true"/>
</managementContext>

 

3. ActiveMQ配置

1)直接创建Bean,方便在项目中直接注入

@Configuration
@EnableJms
public class JmsConfiguration {
    @Bean
    public RemoteJMXBrokerFacade remoteJMXBrokerFacade() {
        RemoteJMXBrokerFacade brokerFacade = new RemoteJMXBrokerFacade();
        System.setProperty("webconsole.jmx.url", "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
        SystemPropertiesConfiguration configuration = new SystemPropertiesConfiguration();
        brokerFacade.setConfiguration(configuration);
        return brokerFacade;
    }
}

2)调用代码

@Resource
private RemoteJMXBrokerFacade brokerFacade;

public void test() throws Exception {
    QueueConsumerQuery consumerQuery = new QueueConsumerQuery(brokerFacade);
    consumerQuery.setJMSDestination("test.queue");
    Collection<SubscriptionViewMBean> consumers = consumerQuery.getConsumers();
    for(SubscriptionViewMBean consumer : consumers) {
        System.out.println("消费者信息:" + consumer.getConnectionId() + "  " + consumer.getSelector());
    }
}

3)测试结果

技术分享图片

这样就能以代码的形式监控ActiveMQ,获取消费者的情况;消费者的其他信息请查看SubscriptionViewMBean的源码。

以上是关于ActiveMQ实践系列1——远程监控的主要内容,如果未能解决你的问题,请参考以下文章

基于ActiveMQ的企业级SOA解决方案与源代码实战

Apache ActiveMQ Fileserver远程代码执行漏洞

ActiveMQ入门系列二:入门代码实例(点对点模式)

消息中间件系列一:入门JMS规范ActiveMQ使用

Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088)分析

Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088)