我使用嵌入式 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 进行测试。
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());