如何从服务器获取队列列表?

时间:2018-12-11 14:31:04

标签: activemq-artemis

有人知道如何从Artemis v2.6.x获取所有队列的列表吗? 我试图从下面的一些MBean中检索它们 org.apache.karaf.jmx,但无法正常运行。 请分享一些可行的解决方案。

1 个答案:

答案 0 :(得分:3)

一些重要说明:

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

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

这是一个简单的代码示例,用于从在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 Management documentation中查看更多详细信息。