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——远程监控的主要内容,如果未能解决你的问题,请参考以下文章
Apache ActiveMQ Fileserver远程代码执行漏洞