知道如何从Artemis v2.6.x中获得所有队列的列表吗?我试着从下面的一些MBean中检索它们org.apache.karaf.jmx
,但它并没有像我预期的那样工作。请分享一些有效的解决方案。
几个重要注意事项:
- Artemis MBean默认在
org.apache.activemq.artemis
下,而不是在org.apache.karaf.jmx
下(尽管可以使用broker.xml中的<jmx-domain>
元素进行配置( - 默认情况下,MBean名称包括代理的
name
(因为多个代理可以在同一JVM中运行(。此名称可使用broker.xml中的<name>
元素进行配置。默认情况下,name
为localhost
。如果需要,可以通过在broker.xml中设置<jmx-use-broker-name>false</jmx-use-broker-name>
将代理name
从MBean的名称中排除 - 有几种方法可以从代理获取队列名称:
getQueueNames()
:此方法位于ActiveMQServerControl
MBean上,并返回在broker上定义的所有队列的名称的String[]
getQueueNames(String)
:此方法位于ActiveMQServerControl
MBean上,并返回路由类型与输入匹配的代理上定义的所有队列的名称的String[]
。有效的输入值是CCD_ 17&CCD_ 18- ActiveMQServerControl的API文档
您可以在Artemis附带的jmx
示例中找到MBean客户端访问队列度量的工作示例。您可以在此处在线查看该示例的代码。
下面是一个简单的代码示例,用于从本地主机上运行的代理获取队列名称:
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管理文档中的更多详细信息。