系統上線運行后,及時監控報警是很必要的手段,對於ActiveMQ而言,主要監控的指標有:MQ本身的健康狀況、每個隊列的生產者數量、消費者數量、隊列的當前消息數等。
ActiveMQ支持JMX監控,使用步驟如下:
一、修改conf/activemq.xml
<broker … useJmx="true”> <managementContext> <managementContext createConnector="true" connectorPort=“jmx端口號” connectorHost=“本機ip地址" /> </managementContext> </broker>
二、設置jmx.access、jmx.password的文件權限
chmod 400 conf/jmx.*
(即:將jmx.password, jmx.access這二個文件設置成只讀權限,activemq出於安全考慮,要求這二個文件只讀)
三、修改bin\activemq 啟動shell腳本
找到invoke_start(){ 這段,然后在前面插入:
ACTIVEMQ_CONF=“jmx.password所在位置的物理路目錄" ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=端口號 " ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"
然后重啟activemq即可。
然后在jconsole中,可以輸入 ip地址:jmx端口號
其中username,password即jmx.password中定義的用戶名和密碼。
四、 spring中使用JMX
<bean class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean" id="mbeanServerConnection1"> <property name="serviceUrl" value="${mq_jmx_url1}"/> <property name="connectOnStartup" value="false"/> <property name="environment"> <props> <prop key="java.naming.security.principal"> ${mq_jmx_user1} </prop> <prop key="java.naming.security.credentials"> ${mq_jmx_passwor1} </prop> </props> </property> </bean>
其中serviceUrl的值類似:service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
參考示例:
private List<ActiveMQData> getMonitorDataList(MBeanServerConnection conn, String objectName) { List<ActiveMQData> datas = new ArrayList<>(); try { ObjectName objRootName = new ObjectName(objectName); String brokerName = (String) conn.getAttribute(objRootName, "BrokerName"); String brokerId = (String) conn.getAttribute(objRootName, "BrokerId"); String openWireUrl = (String) conn.getAttribute(objRootName, "OpenWireURL"); //健康狀態 ObjectName healthObjName = new ObjectName(objectName + ",service=Health"); String healthStatus = (String) conn.getAttribute(healthObjName, "CurrentStatus"); //遍歷隊列 ObjectName[] objectNames = (ObjectName[]) conn.getAttribute(objRootName, "Queues"); Arrays.sort(objectNames); List<String> blackList = monitorConfig.getQueueBlackList(); for (ObjectName queueName : objectNames) { ... Long queueSize = (Long) conn.getAttribute(queueName, "QueueSize");//隊列消息數量 Long producerCount = (Long) conn.getAttribute(queueName, "ProducerCount");//生產者數量 Long consumerCount = (Long) conn.getAttribute(queueName, "ConsumerCount");//消費者數量 Long enqueueCount = (Long) conn.getAttribute(queueName, "EnqueueCount");//入隊消息總數 Long dequeueCount = (Long) conn.getAttribute(queueName, "DequeueCount");//出隊消息總數 ... } } catch (Exception e) { ... } return datas; }
其中objectName值,可以在jconsole中查到