连接到远程 JMX 代理 ActiveMQ Artemis 时出错

huangapple go评论89阅读模式
英文:

Error connecting to remote JMX broker ActiveMQ Artemis

问题

I have code that connects to the ActiveMQ Artemis broker console via JMX. It connects to localhost, but it cannot connect to a remote host, although the settings are the same

Here is the code to connect:

  1. public static QueueControl getQueueControl(String queue, MBeanServerConnection mBeanServerConnection) {
  2. QueueControl queueControl = null;
  3. Queue dynamicQueue = null;
  4. try {
  5. dynamicQueue = (Queue) initialContext.lookup("dynamicQueues/" + queue);
  6. } catch (NamingException e) {
  7. e.printStackTrace();
  8. }
  9. MBeanServerConnection mbsc = mBeanServerConnection;
  10. ObjectName on = null;
  11. try {
  12. on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. queueControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, QueueControl.class, false);
  17. try {
  18. queueLength = queueControl.browse().length;
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. i = queueLength;
  23. return queueControl;
  24. }

It seems to me that the error is in the field:

  1. on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);

Because the Default value is:

  1. public static final ObjectNameBuilder DEFAULT = new ObjectNameBuilder(ActiveMQDefaultConfiguration.getDefaultJmxDomain(), "localhost", true);

Here is the error that occurs:

  1. javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="localhost",component=addresses,address="queueTest",subcomponent=queues,routing-type="anycast",queue="queueTest"
  2. at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)
  3. ...

It seems to me that the error is in the Default variable. And if in it, then what should I replace it with so that I can connect to both the local broker and the remote one?

I did the method as you described, but now there is no connection either to localhost or to a remote broker:

  1. public static QueueControl getQueueControl(String queue, MBeanServerConnection mBeanServerConnection) {
  2. QueueControl queueControl = null;
  3. try {
  4. Queue dynamicQueue = (Queue) initialContext.lookup("dynamicQueues/" + queue);
  5. MBeanServerConnection mbsc = mBeanServerConnection;
  6. String brokerName = mbsc.queryNames(
  7. ObjectName.getInstance("org.apache.activemq.artemis:broker=*"),
  8. null).stream().findFirst().get().getKeyProperty("broker");
  9. ObjectNameBuilder myONB = ObjectNameBuilder.create(
  10. ActiveMQDefaultConfiguration.getDefaultJmxDomain(), brokerName, true);
  11. ObjectName on = myONB.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);
  12. queueControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, QueueControl.class, false);
  13. queueLength = queueControl.browse().length;
  14. i = queueLength;
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. return queueControl;
  19. }

Error stacktrace:

  1. javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="localhost",component=addresses,address="exampleQueue",subcomponent=queues,routing-type="anycast",queue="exampleQueue"
  2. ...

The error appears in this field:

  1. queueLength = queueControl.browse().length;

And yes, I have tried to create an ObjectNameBuilder as you described, but it shows an error when creating:

  1. 'ObjectNameBuilder(java.lang.String, java.lang.String, boolean)' has private access in 'org.apache.activemq.artemis.api.core.management.ObjectNameBuilder'
英文:

I have code that connects to the ActiveMQ Artemis broker console via JMX. It connects to localhost, but it cannot connect to a remote host, although the settings are the same

Here is the code to connect:

  1. public static QueueControl getQueueControl(String queue, MBeanServerConnection mBeanServerConnection) {
  2. QueueControl queueControl = null;
  3. Queue dynamicQueue = null;
  4. try {
  5. dynamicQueue = (Queue) initialContext.lookup("dynamicQueues/" + queue);
  6. } catch (NamingException e) {
  7. e.printStackTrace();
  8. }
  9. MBeanServerConnection mbsc = mBeanServerConnection;
  10. ObjectName on = null;
  11. try {
  12. on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. queueControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, QueueControl.class, false);
  17. try {
  18. queueLength = queueControl.browse().length;
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. i = queueLength;
  23. return queueControl;
  24. }

It seems to me that the error is in the field:

  1. on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);

Because the Default value is:

  1. public static final ObjectNameBuilder DEFAULT = new ObjectNameBuilder(ActiveMQDefaultConfiguration.getDefaultJmxDomain(), "localhost", true);

Here is the error that occurs:

  1. javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="localhost",component=addresses,address="queueTest",subcomponent=queues,routing-type="anycast",queue="queueTest"
  2. at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)
  3. at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getClassLoaderFor(DefaultMBeanServerInterceptor.java:1421)
  4. at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.getClassLoaderFor(JmxMBeanServer.java:1322)
  5. at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
  6. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  7. at java.base/java.lang.reflect.Method.invoke(Method.java:566)
  8. at org.apache.activemq.artemis.core.server.management.ArtemisMBeanServerBuilder$MBeanInvocationHandler.invoke(ArtemisMBeanServerBuilder.java:96)
  9. at com.sun.proxy.$Proxy13.getClassLoaderFor(Unknown Source)
  10. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$6.run(RMIConnectionImpl.java:1363)
  11. at java.base/java.security.AccessController.doPrivileged(Native Method)
  12. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.getClassLoaderFor(RMIConnectionImpl.java:1360)
  13. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:811)
  14. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  15. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  16. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  17. at java.base/java.lang.reflect.Method.invoke(Method.java:566)
  18. at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
  19. at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
  20. at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
  21. at java.base/java.security.AccessController.doPrivileged(Native Method)
  22. at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
  23. at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
  24. at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
  25. at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
  26. at java.base/java.security.AccessController.doPrivileged(Native Method)
  27. at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
  28. at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
  29. at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
  30. at java.base/java.lang.Thread.run(Thread.java:834)
  31. at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)
  32. at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)
  33. at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:164)
  34. at jdk.remoteref/jdk.jmx.remote.internal.rmi.PRef.invoke(Unknown Source)
  35. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source)
  36. at java.management.rmi/javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1021)

It seems to me that the error is in the Default variable. And if in it, then what should I replace it with so that I can connect to both the local broker and the remote one?

I did the method as you described, but now there is no connection either to localhost or to a remote broker:

  1. public static QueueControl getQueueControl(String queue, MBeanServerConnection mBeanServerConnection) {
  2. QueueControl queueControl = null;
  3. try {
  4. Queue dynamicQueue = (Queue) initialContext.lookup("dynamicQueues/" + queue);
  5. MBeanServerConnection mbsc = mBeanServerConnection;
  6. String brokerName = mbsc.queryNames(
  7. ObjectName.getInstance("org.apache.activemq.artemis:broker=*"),
  8. null).stream().findFirst().get().getKeyProperty("broker");
  9. ObjectNameBuilder myONB = ObjectNameBuilder.create(
  10. ActiveMQDefaultConfiguration.getDefaultJmxDomain(), brokerName, true);
  11. ObjectName on = myONB.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);
  12. queueControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, QueueControl.class, false);
  13. queueLength = queueControl.browse().length;
  14. i = queueLength;
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. return queueControl;
  19. }

Error stacktrace:

  1. javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="\"localhost\"",component=addresses,address="exampleQueue",subcomponent=queues,routing-type="anycast",queue="exampleQueue"
  2. at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)
  3. at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getClassLoaderFor(DefaultMBeanServerInterceptor.java:1421)
  4. at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.getClassLoaderFor(JmxMBeanServer.java:1322)
  5. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  6. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  7. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  8. at java.base/java.lang.reflect.Method.invoke(Method.java:566)
  9. at org.apache.activemq.artemis.core.server.management.ArtemisMBeanServerBuilder$MBeanInvocationHandler.invoke(ArtemisMBeanServerBuilder.java:96)
  10. at com.sun.proxy.$Proxy30.getClassLoaderFor(Unknown Source)
  11. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$6.run(RMIConnectionImpl.java:1363)
  12. at java.base/java.security.AccessController.doPrivileged(Native Method)
  13. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.getClassLoaderFor(RMIConnectionImpl.java:1360)
  14. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:811)
  15. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  16. at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  17. at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  18. at java.base/java.lang.reflect.Method.invoke(Method.java:566)
  19. at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
  20. at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
  21. at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
  22. at java.base/java.security.AccessController.doPrivileged(Native Method)
  23. at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
  24. at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
  25. at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
  26. at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
  27. at java.base/java.security.AccessController.doPrivileged(Native Method)
  28. at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
  29. at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
  30. at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
  31. at java.base/java.lang.Thread.run(Thread.java:834)
  32. at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)
  33. at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)
  34. at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:164)
  35. at jdk.remoteref/jdk.jmx.remote.internal.rmi.PRef.invoke(Unknown Source)
  36. at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source)
  37. at java.management.rmi/javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1021)
  38. at java.management/javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:298)
  39. at com.sun.proxy.$Proxy7.browse(Unknown Source)

The error appears in this field:

  1. queueLength = queueControl.browse().length;

And yes, I have tried to create an ObjectNameBuilder as you described, but it shows an error when creating:

  1. 'ObjectNameBuilder(java.lang.String, java.lang.String, boolean)' has private access in 'org.apache.activemq.artemis.api.core.management.ObjectNameBuilder'

答案1

得分: 2

  1. `ObjectNameBuilder`必须使用与broker.xml文件中定义的经纪人名称进行初始化,即如果broker.xml文件中的名称为`<name>0.0.0.0</name>`,则创建以下`ObjectNameBuilder`
  2. ```java
  3. ObjectNameBuilder myONB = ObjectNameBuilder.create(
  4. ActiveMQDefaultConfiguration.getDefaultJmxDomain(), "<name>0.0.0.0</name>", true);

或者,您可以执行查询以获取经纪人名称,例如:

  1. String brokerName = mbsc.queryNames(
  2. ObjectName.getInstance("org.apache.activemq.artemis:broker=*"),
  3. null).stream().findFirst().get().getKeyProperty("broker").replace("\\\"", "");
  4. ObjectNameBuilder myONB = ObjectNameBuilder.create(
  5. ActiveMQDefaultConfiguration.getDefaultJmxDomain(), brokerName, true);

然后使用它创建一个ObjectName:

  1. myONB.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);
  1. <details>
  2. <summary>英文:</summary>
  3. The `ObjectNameBuilder` must be initialized with the same broker name defined in the broker.xml file, i.e. if the name in the broker.xml file is `&lt;name&gt;0.0.0.0&lt;/name&gt;` create the following ObjectNameBuilder:

ObjectNameBuilder myONB = ObjectNameBuilder.create(
ActiveMQDefaultConfiguration.getDefaultJmxDomain(), "0.0.0.0", true);

  1. alternatively, you could get the broker name executing a query, i.e.:

String brokerName = mbsc.queryNames(
ObjectName.getInstance("org.apache.activemq.artemis:broker=*"),
null).stream().findFirst().get().getKeyProperty("broker").replace("&quot;", "");

ObjectNameBuilder myONB = ObjectNameBuilder.create(
ActiveMQDefaultConfiguration.getDefaultJmxDomain(), brokerName, true);

  1. and use it to create an ObjectName:

myONB.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);

  1. </details>

huangapple
  • 本文由 发表于 2023年6月5日 17:53:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/76405248.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定