ActiveMQ實踐系列1——遠端監控
阿新 • • 發佈:2018-12-05
近期專案中應用到了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的原始碼。