一、說明
ActiveMQ使用過程中,可以使用自帶的控制台進行相關的操作以及查看,但是當隊列數相當多的時候,在查詢以及整體的監控上,就可能相當的不便。所以可通過JMX的方式,進行MQ中隊列相關指標的以及整體健康性能等收集展示。
二、JMX功能開啟
2.1、broker標簽中添加 userJmx="true":

2.2、配置 managementContext

其中 用戶名、密碼及權限配置在 jmx.password 和 jmx.access 文件中。
三、Java應用連接使用
3.1、獲取在線的隊列消費者IP
private static final String queueObjectName = "org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=%s";
private static final String brokerAddress = "service:jmx:rmi:///jndi/rmi://%s/jmxrmi";
private static List<String> getQueueConsumers(String user, String password, String ip, String queueName) throws Exception{
List<String> result = Lists.newArrayList();
String url = String.format(brokerAddress, ip);
Map<String, Object> credentials = new HashMap<>();
credentials.put(JMXConnector.CREDENTIALS, new String[] {user, password});
JMXServiceURL urls = new JMXServiceURL(url);
JMXConnector connector = JMXConnectorFactory.connect(urls,credentials);
connector.connect();
MBeanServerConnection conn = connector.getMBeanServerConnection();
ObjectName name = new ObjectName(String.format(queueObjectName, queueName));
QueueViewMBean queueViewMBean = MBeanServerInvocationHandler.newProxyInstance(conn, name, QueueViewMBean.class, true);
for (ObjectName mbeanNameConsumerObjectName : queueViewMBean.getSubscriptions()) {
SubscriptionViewMBean subscriptionViewMBean = MBeanServerInvocationHandler.newProxyInstance(conn, mbeanNameConsumerObjectName,SubscriptionViewMBean.class, true);
ObjectName connectionObjectName = new ObjectName(subscriptionViewMBean.getConnection().getCanonicalName());
ConnectionViewMBean connectionViewMBean = MBeanServerInvocationHandler.newProxyInstance(conn, connectionObjectName,ConnectionViewMBean.class, true);
if (connectionViewMBean != null) {
result.add(connectionViewMBean.getRemoteAddress().replace("//", "").split("\\:")[1]);
// System.out.println(connectionViewMBean.getRemoteAddress()+"|"+connectionViewMBean.getClientId());
}
}
return result;
}
其中方法的參數: ip - broker的 ip 地址,user - JMX登錄訪問的用戶名,password - JMX登錄訪問的密碼,queueName - 待查詢的隊列名
3.2、獲取隊列的出隊、入隊以及積壓數等指標信息
package workMQ;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.ConnectionViewMBean;
import org.apache.activemq.broker.jmx.ConnectorViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;
import com.google.common.collect.Maps;
public class Test08 {
public static void main(String[] args) throws Exception {
String ip = "192.168.25.43:9607";
String url = String.format("service:jmx:rmi:///jndi/rmi://%s/jmxrmi",ip);
Map<String, Object> credentials = new HashMap<>();
credentials.put(JMXConnector.CREDENTIALS, new String[] {"admin", "activemq"});
JMXServiceURL urls = new JMXServiceURL(url);
JMXConnector connector = JMXConnectorFactory.connect(urls,credentials);
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("隊列的名稱:"+queueBean.getName());
System.out.println("消息積壓數:"+queueBean.getQueueSize());
System.out.println("入隊:"+queueBean.getEnqueueCount());
System.out.println("出隊:"+queueBean.getDequeueCount());
System.out.println("消費者數:"+queueBean.getConsumerCount());
System.out.println("生產者數:"+queueBean.getProducerCount());
//還有很多隊列指標信息,具體可根據實際使用獲取
}
}
}
四、JDK自帶JConsole連接
1、JDK安裝目錄下的 bin 文件夾,點擊JConsole.exe

2、選擇遠程進程,輸入 brokerAddress、username、password
brokerAddress 格式 : service:jmx:rmi:///jndi/rmi://具體的brokerip地址:配置的JMX的port訪問端口/jmxrmi
username、password 即是JMX的訪問用戶名、密碼

3、進入后,可查看相關信息

