ActiveMQ遠程JMX監控隊列消息條數,進行預警

前言

ActiveMQ最近發現消息積壓比較嚴重,消息最多的時候導致ActiveMQ直接內存溢出了,然後想着監控一個ActiveMQ隊列消息大小,當積壓的數量達到一定閾值的時候預警。

參考鏈接

ActiveMQ JMX使用
JMX遠程監控ActiveMQ設置
ActiveMQ 遠程監控JMX設置
activemq讀取剩餘消息隊列中消息的數量
ActiveMQ監控
activemq的jmx監控以及死消息的處理
https://activemq.apache.org/jmx

配置JMX

修改activemq的activemq.xml 配置文件

找到activemq的conf目錄

/home/zookeeper/apache-activemq-5.15.12/conf

修改配置activemq.xml配置文件
找到<broker xmlns="http://activemq.apache.org/schema/core"

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" useJmx="true"  dataDirectory="${activemq.data}">

添加useJmx="true" 開啓JMX
找到managementContext節點,設置createConnector connectorHost connectorPort connectorPath jmxDomainName這幾個屬性就可以了,這裏一定要設置connectorHost,要不然會遇到另外一個錯誤。

 <managementContext>
              <managementContext createConnector="true" connectorHost="192.168.1.134"  connectorPort="1099"   connectorPath="/jmxrmi" jmxDomainName="org.apache.activemq"/>
        </managementContext>

設置好之後重啓ActiveMQ就可以,然後使用下面的代碼進行獲取隊列的消息,也可以用purge()方法來清空消息。

代碼

這裏的代碼沒有使用用戶名和密碼,

public class MonitorActiveMQ {

    public static void main(String[] args) throws Exception {
        String url = "service:jmx:rmi:///jndi/rmi://192.168.1.134:1099/jmxrmi";
        JMXServiceURL urls = new JMXServiceURL(url);
        JMXConnector connector = JMXConnectorFactory.connect(urls, null);
        connector.connect();
        MBeanServerConnection conn = connector.getMBeanServerConnection();
        ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
        BrokerViewMBean mBean = (BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, name, BrokerViewMBean.class, true);
        for (ObjectName na : mBean.getQueues()) {
            QueueViewMBean queueBean = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, na, QueueViewMBean.class, true);
            System.out.println("******************************");
            System.out.println("隊列的名稱:" + queueBean.getName());
            System.out.println("隊列中剩餘的消息數:" + queueBean.getQueueSize());
            System.out.println("消費者數:" + queueBean.getConsumerCount());
            System.out.println("出隊列的數量:" + queueBean.getDequeueCount());
            queueBean.purge();
        }
        connector.close();
    }
}

有密碼的

但是上面的配置沒有設置用戶名和密碼,所以這裏配置了也不生效。

 public static void main(String[] args) throws Exception {
        String url = "service:jmx:rmi:///jndi/rmi://192.168.1.134:1099/jmxrmi";
        JMXServiceURL urls = new JMXServiceURL(url);
        Map<String, String[]> env = new HashMap<>();
        String[] credentials = {"admin", "activemq"};
        env.put(JMXConnector.CREDENTIALS, credentials);
        JMXConnector connector = JMXConnectorFactory.connect(urls, env);
        connector.connect();
        MBeanServerConnection conn = connector.getMBeanServerConnection();
        ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
        BrokerViewMBean mBean = (BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, name, BrokerViewMBean.class, true);
        for (ObjectName na : mBean.getQueues()) {
            QueueViewMBean queueBean = (QueueViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, na, QueueViewMBean.class, true);
            System.out.println("******************************");
            System.out.println("隊列的名稱:" + queueBean.getName());
            System.out.println("隊列中剩餘的消息數:" + queueBean.getQueueSize());
            System.out.println("消費者數:" + queueBean.getConsumerCount());
            System.out.println("出隊列的數量:" + queueBean.getDequeueCount());
            queueBean.purge();
        }
        connector.close();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章