ActiveMQ錯誤 javax.management.InstanceNotFoundException: org.apache.activemq:brokerName=,type=Broker

最近發現環境出現ActiveMQ經常掛,報錯的內存溢出,原因差不多應該是隊列裏面的消費放的太多,內存設置的比較小,因爲這個ActiveMQ只是輔助系統運行的,所以也沒怎麼在意ActiveMQ的設置相關。

目的

然後想着希望寫個程序或者腳本來監控生產的消息條數,當消息條數超過一次的條數就直接清空,然後發現ActiveMQ可以啓動JMX,配置JMX之後就可以連接了。

連接代碼

注意點

String url = "service:jmx:rmi:///jndi/rmi://192.168.1.134:1099/jmxrmi";這裏需要輸入自己ActiveMQ的IP和JMX的端口。
ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");這裏的localhost是指當前ActiveMQ的節點名稱,不是隊列名稱,剛開始我輸入了的是隊列名稱,一直報錯,brokerName的名字可以在activemq的配置文件裏面看,也可以從activemq的控制裏面找,如下圖。
還有一個問題就是這裏的brokerName、type首字母必須小寫,
ActiveMQ 5.8.0 Release 這個版本修改了名稱
在這裏插入圖片描述

在這裏插入圖片描述

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

異常代碼

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
	at com.sun.proxy.$Proxy0.getQueues(Unknown Source)
	at com.imobpay.monitor.services.task.MonitorActiveMQ.main(MonitorActiveMQ.java:26)
Caused by: javax.management.InstanceNotFoundException: org.apache.activemq:brokerName=localhost2,type=Broker
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:643)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:678)
	at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1445)
	at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
	at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
	at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
	at javax.management.remote.rmi.RMIConnectionImpl.getAttribute(RMIConnectionImpl.java:639)
	at sun.reflect.GeneratedMethodAccessor37.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
	at sun.rmi.transport.Transport$1.run(Transport.java:200)
	at sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:283)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:260)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:161)
	at com.sun.jmx.remote.internal.PRef.invoke(Unknown Source)
	at javax.management.remote.rmi.RMIConnectionImpl_Stub.getAttribute(Unknown Source)
	at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.getAttribute(RMIConnector.java:903)
	at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:273)
	... 2 more

Process finished with exit code 1

總結

雖然這個問題挺簡單的,面向百度編程也很容易解決,主要是粗心,拷貝也不注意看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章