ActiveMQ實踐系列1——遠程監控
阿新 • • 發佈:2018-12-06
void pre console creat throw except jms host 整合
近期項目中應用到了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——遠程監控