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

标签 java jms jmx activemq-artemis

我有通过 JMX 连接到 ActiveMQ Artemis 代理控制台的代码。它连接到本地主机,但无法连接到远程主机,尽管设置相同

这是连接的代码:

public static QueueControl getQueueControl(String queue, MBeanServerConnection mBeanServerConnection) {
        QueueControl queueControl = null;
        Queue dynamicQueue = null;
        try {
            dynamicQueue = (Queue) initialContext.lookup("dynamicQueues/" + queue);
        } catch (NamingException e) {
            e.printStackTrace();
        }
        MBeanServerConnection mbsc = mBeanServerConnection;
        ObjectName on = null;
        try {
            on = ObjectNameBuilder.DEFAULT.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);
        } catch (Exception e) {
            e.printStackTrace();
        }
        queueControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, QueueControl.class, false);
        try {
            queueLength = queueControl.browse().length;
        } catch (Exception e) {
            e.printStackTrace();
        }
        i = queueLength;
        return queueControl;
    }

在我看来,错误出现在该字段中:

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

因为默认值为:

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

这是发生的错误:

javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="localhost",component=addresses,address="queueTest",subcomponent=queues,routing-type="anycast",queue="queueTest"
 at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)
 at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getClassLoaderFor(DefaultMBeanServerInterceptor.java:1421)
 at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.getClassLoaderFor(JmxMBeanServer.java:1322)
 at java.base/jdk.internal.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.base/java.lang.reflect.Method.invoke(Method.java:566)
 at org.apache.activemq.artemis.core.server.management.ArtemisMBeanServerBuilder$MBeanInvocationHandler.invoke(ArtemisMBeanServerBuilder.java:96)
 at com.sun.proxy.$Proxy13.getClassLoaderFor(Unknown Source)
 at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$6.run(RMIConnectionImpl.java:1363)
 at java.base/java.security.AccessController.doPrivileged(Native Method)
 at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.getClassLoaderFor(RMIConnectionImpl.java:1360)
 at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:811)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.base/java.lang.reflect.Method.invoke(Method.java:566)
 at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
 at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
 at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
 at java.base/java.security.AccessController.doPrivileged(Native Method)
 at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
 at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
 at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
 at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
 at java.base/java.security.AccessController.doPrivileged(Native Method)
 at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
 at java.base/java.lang.Thread.run(Thread.java:834)
 at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)
 at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)
 at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:164)
 at jdk.remoteref/jdk.jmx.remote.internal.rmi.PRef.invoke(Unknown Source)
 at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source)
 at java.management.rmi/javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1021)

在我看来,错误出在默认变量中。如果在其中,那么我应该用什么替换它,以便我可以连接到本地代理和远程代理?

我按照您所描述的方法进行了操作,但现在没有与本地主机或远程代理的连接:

public static QueueControl getQueueControl(String queue, MBeanServerConnection mBeanServerConnection) {
    QueueControl queueControl = null;
    try {

        Queue dynamicQueue = (Queue) initialContext.lookup("dynamicQueues/" + queue);
        MBeanServerConnection mbsc = mBeanServerConnection;
        String brokerName = mbsc.queryNames(
                ObjectName.getInstance("org.apache.activemq.artemis:broker=*"),
                null).stream().findFirst().get().getKeyProperty("broker");

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

        ObjectName on = myONB.getQueueObjectName(SimpleString.toSimpleString(dynamicQueue.getQueueName()), SimpleString.toSimpleString(dynamicQueue.getQueueName()), RoutingType.ANYCAST);
        queueControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, QueueControl.class, false);
        queueLength = queueControl.browse().length;
        i = queueLength;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return queueControl;
}

错误堆栈跟踪:

javax.management.InstanceNotFoundException: org.apache.activemq.artemis:broker="\"localhost\"",component=addresses,address="exampleQueue",subcomponent=queues,routing-type="anycast",queue="exampleQueue"
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1083)
at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getClassLoaderFor(DefaultMBeanServerInterceptor.java:1421)
at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.getClassLoaderFor(JmxMBeanServer.java:1322)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.apache.activemq.artemis.core.server.management.ArtemisMBeanServerBuilder$MBeanInvocationHandler.invoke(ArtemisMBeanServerBuilder.java:96)
at com.sun.proxy.$Proxy30.getClassLoaderFor(Unknown Source)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$6.run(RMIConnectionImpl.java:1363)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.getClassLoaderFor(RMIConnectionImpl.java:1360)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:811)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)
at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)
at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:164)
at jdk.remoteref/jdk.jmx.remote.internal.rmi.PRef.invoke(Unknown Source)
at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source)
at java.management.rmi/javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1021)
at java.management/javax.management.MBeanServerInvocationHandler.invoke(MBeanServerInvocationHandler.java:298)
at com.sun.proxy.$Proxy7.browse(Unknown Source)

此字段中出现错误:

queueLength = queueControl.browse().length;

是的,我尝试按照您的描述创建一个 ObjectNameBuilder,但在创建时显示错误:

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

最佳答案

ObjectNameBuilder必须使用在broker.xml 文件中定义的相同代理名称进行初始化,即,如果broker.xml 文件中的名称是 <name>0.0.0.0</name>创建以下 ObjectNameBuilder:

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

或者,您可以获取执行查询的代理名称,即:

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

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

并用它来创建一个 ObjectName:

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

关于java - 连接到远程 JMX 代理 ActiveMQ Artemis 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76405248/

相关文章:

java - 如何在 JBoss EAP 7 中配置 JMS?

java - JMS 与 Spring 和 Webspehre MQ 集成的 JNDI

java - 获取集合子集的策略

java - 将监听器从一个编辑文本更改为第二个编辑文本

java - FontAwesome 没有显示在 Thymeleaf 中?

java - jmx mbean线程安全

java - 可选的 JMX ManagedOperationParameter

java - Android Facebook SDK 没有找到类定义 com.facebook.android.Facebook

java - JMS 传输与 MQ 传输

java - JBoss中如何查看数据源?