ActiveMQ筆記(5):JMX監控


系統上線運行后,及時監控報警是很必要的手段,對於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中查到 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM