1. 程式人生 > >ActiveMQ實踐系列1——遠端監控

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的原始碼。