首页 > 解决方案 > 如何从服务器获取队列列表?

问题描述

知道如何从 Artemis v2.6.x 中获取所有队列的列表吗?我试图从 下的一些 MBean 中检索它们 org.apache.karaf.jmx,但它没有按我预期的那样工作。请分享一些可行的解决方案。

标签: activemq-artemis

解决方案


几个重要的注意事项:

  • Artemis MBeansorg.apache.activemq.artemis默认不在org.apache.karaf.jmx (尽管可以使用<jmx-domain>broker.xml 中的元素进行配置)。
  • 默认情况下,MBean 名称包括name代理的名称(因为多个代理可以在同一个 JVM 中运行)。此名称可使用<name>broker.xml 中的元素进行配置。默认情况下namelocalhost。如果需要,可以通过在 broker.xml 中设置来将代理name从 MBean 的名称中排除。<jmx-use-broker-name>false</jmx-use-broker-name>
  • 有几种方法可以从代理获取队列名称:
    • getQueueNames():此方法在ActiveMQServerControlMBean 上,并返回String[]在代理上定义的所有队列的名称中的一个。
    • getQueueNames(String):此方法在ActiveMQServerControlMBean 上,并返回String[]在其路由类型与输入匹配的代理上定义的所有队列的名称中的一个。有效的输入值为anycast& multicast
    • ActiveMQServerControl 的 API 文档

jmx您可以在Artemis 附带的示例中找到访问队列指标的 MBean 客户端的工作示例。您可以在此处在线查看该示例的代码。

下面是从 localhost 上运行的代理获取队列名称的简单代码示例:

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.HashMap;

import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;

public class JMXExample {

   public static void main(final String[] args) throws Exception {
      ObjectName on = ObjectNameBuilder.DEFAULT.getActiveMQServerObjectName();
      JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"), new HashMap());
      MBeanServerConnection mbsc = connector.getMBeanServerConnection();
      ActiveMQServerControl serverControl = MBeanServerInvocationHandler.newProxyInstance(mbsc, on, ActiveMQServerControl.class, false);
      for (String queueName : serverControl.getQueueNames()) {
         System.out.println(queueName);
      }
      connector.close();
   }
}

在Artemis 管理文档中查看更多详细信息。


推荐阅读