Accessing Apache ActiveMQ via JMX throws Exception

匿名 (未验证) 提交于 2019-12-03 01:49:02

问题:

I'm using a fresh ActiveMQ 5.8.0 installation, where I have a message in a queue called 'testing'. I also replaced the ACTIVEMQ_SUNJMX line in bin/activemq to enable JMX:

ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" 

Then I query JMX via the following code:

    try {         JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"));         connector.connect();         MBeanServerConnection connection = connector.getMBeanServerConnection();          ObjectName mbeanName = new ObjectName("org.apache.activemq:BrokerName=localhost,Type=Broker");         BrokerViewMBean mbean = MBeanServerInvocationHandler.newProxyInstance(connection, mbeanName, BrokerViewMBean.class, true);          System.out.println("Id:" + mbean.getBrokerId()); // here the exception will be thrown     }     catch (Exception x) {         x.printStackTrace();     } 

The Exception is thrown when accessing the mbean.

java.lang.reflect.UndeclaredThrowableException     at $Proxy0.getBrokerId(Unknown Source)     at testing.TestJmx.main(TestJmx.java:25) Caused by: javax.management.InstanceNotFoundException: org.apache.activemq:BrokerName=localhost,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:668)     at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1424)     at javax.management.remote.rmi.RMIConnectionImpl.access$200(RMIConnectionImpl.java:89)     at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1292)     at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1380)     at javax.management.remote.rmi.RMIConnectionImpl.getAttribute(RMIConnectionImpl.java:621)     at sun.reflect.GeneratedMethodAccessor30.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:601)     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)     at sun.rmi.transport.Transport$1.run(Transport.java:177)     at sun.rmi.transport.Transport$1.run(Transport.java:174)     at java.security.AccessController.doPrivileged(Native Method)     at sun.rmi.transport.Transport.serviceCall(Transport.java:173)     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)     at java.lang.Thread.run(Thread.java:722)     at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)     at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:160)     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:901)     at javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:280)     ... 2 more 

I checked that that port is listening, VisualVM also shows me the mbeans, ideas?

回答1:

The fact that bean names have changed is documented on the 5.8.0 release page.

So your ObjectName should be of the form:

    ObjectName mbeanName = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost"); 


回答2:

Excellent answer. Here you have an example of use: API Docs

There is also something important that changes from 5.7 to 5.8. The default URL for JMX services goes from:

service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmxrmi 

to:

service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi 


回答3:

Lovely question and answer too, I was having a hard time configuring JMX. ActiveMQ docs isn't up-to-date in this regard. Eg : http://activemq.apache.org/jmx.html doesn't say that from 5.8.0 onwards "SUNJMX" becomes "ACTIVEMQ_SUNJMX_START".

The config provided by OP , ie : ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

, and the corresponding code is the one that really worked for me. Thanks ! ( I am using ActiveMQ 5.8)



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!