前言
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();
}