无法通过 JMX 远程连接嵌入式 ActiveMQ Artemis

问题描述 投票:0回答:1

我使用嵌入式 ActiveMQ Artemis 2.38.0 进行测试。我创建了嵌入式 ActiveMQ Artemis,如下所示:

Configuration mqConfig = new ConfigurationImpl();
server = new EmbeddedActiveMQ();
mqConfig.addAcceptorConfiguration("tcp", "tcp://127.0.0.1:61616");
mqConfig.setSecurityEnabled(false);
mqConfig.setJMXManagementEnabled(true);
mqConfig.setMessageCounterEnabled(true);
mqConfig.setMessageCounterSamplePeriod(500);
mqConfig.setMessageCounterMaxDayHistory(1);
server.setConfiguration(mqConfig);
server.start();

创建这个嵌入式服务器后,我创建了几个队列。然后我使用JMX远程访问来获取队列深度:

JMXServiceURL url = new JMXServiceURL(jmxUrl);
JMXConnector jmxc = JMXConnectorFactory.connect(url);
....

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

但是,我收到了这个错误:

Caused by: java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
    java.net.ConnectException: Connection refused: connect]

我怀疑 JMX 没有运行。我被困住了。

我想使用 JMX 获取仅在测试中在嵌入式 ActiveMQ Artemis 服务器上创建的队列的队列深度。

这个应用程序是旧的 Spring Boot 应用程序,我正在尝试将其从 Spring Boot 2.x 升级到 Spring Boot 3.x,并将 Java 从 11 升级到 17。这曾经使用嵌入式 ActiveMQ Classic。它不适用于 Spring Boot 3.x,因此我切换到嵌入式 ActiveMQ Artemis。 现在,JMX 不适用于此嵌入式 ActiveMQ Artemis。

我搜索了此 https://github.com/apache/activemq-artemis-examples/tree/main 存储库中的所有示例,但我找不到任何嵌入式 ActiveMQ Artemis + JMX 的示例。

我确实需要嵌入式 ActiveMQ Artemis + JMX 进行测试。

jms activemq-artemis
1个回答
0
投票

EmbeddedActiveMQ
不会管理自己的MBean服务器。但是,您可以自己创建一个并使用
EmbeddedActiveMQ
方法将其传递给
setMbeanServer
。然后,代理将获取此 MBean 服务器并在其中注册其所有 MBean,例如:

MBeanServer mbeanServer = MBeanServerFactory.createMBeanServer();
LocateRegistry.createRegistry(1099);
JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"), Map.of("jmx.remote.protocol.provider.pkgs", "javax.management.remote.rmi", "jmx.remote.server.default.class", "javax.management.remote.rmi.RMIServerImpl"), mbeanServer);
connectorServer.start();

Configuration mqConfig = new ConfigurationImpl();
server = new EmbeddedActiveMQ();
// customize your EmbeddedActiveMQ here
server.setMbeanServer(mbeanServer);
server.start();

然后您可以与客户端 URL 建立 JMX 连接,如下所示:

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

也就是说,如果代码尝试在与您的

EmbeddedActiveMQ
相同的 JVM 中获取队列深度,那么您可以简单地执行类似的操作来获取名为
foo
的队列的深度:

System.out.println("Queue depth for \"foo\": " + server.getActiveMQServer().locateQueue("foo").getMessageCount());
© www.soinside.com 2019 - 2024. All rights reserved.