Java ActiveMQ:通过JMX获取连接列表?

Java ActiveMQ:通过JMX获取连接列表?,java,activemq,jmx,Java,Activemq,Jmx,如何获取ActiveMQ的OpenWire连接器的连接列表? JConsole可以列出连接,但我看不出可以使用哪个“视图”来获取列表: 连接的ObjectName示例: org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire,Connection=toto 我尝试了“ConnectorViewMBean”,但其上的操作不允许我列出连接: ObjectName name=newobjectnam

如何获取ActiveMQ的OpenWire连接器的连接列表? JConsole可以列出连接,但我看不出可以使用哪个“视图”来获取列表:

连接的ObjectName示例:
org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire,Connection=toto

我尝试了“ConnectorViewMBean”,但其上的操作不允许我列出连接:

ObjectName name=newobjectname(“org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire”);
mbsc.getMBeanInfo(名称);
ConnectorViewMBean视图=JMX.newMBeanProxy(mbsc,名称,ConnectorViewMBean.class);

解决方案是使用一个表达式:

ObjectName connectionNames = 
      new ObjectName("org.apache.activemq:BrokerName=localhost," + 
                     "Type=Connection,ConnectorName=openwire,Connection=*");

Set<ObjectName> names = mbsc.queryNames(connectionNames, null); 
for(ObjectName name : names) { 
   logger.error("Name: "+name.getCanonicalName()); 
} 
ObjectName connectionNames=
新的ObjectName(“org.apache.activemq:BrokerName=localhost,”+
“类型=连接,连接名=openwire,连接=*”;
Set names=mbsc.queryNames(connectionNames,null);
对于(ObjectName:names){
logger.error(“Name:+Name.getCanonicalName());
} 

我正在使用ActiveMQ 5.14.5,它使用不同的ObjectName格式通过JMX查询连接。此版本的ActiveMQ中的等效项为:

final JMXServiceURL=newjmxserviceurl(“服务:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
最终的JMXConnector连接器=JMXConnectorFactory.connect(url,null);
connector.connect();
最终ObjectName connectionName=新ObjectName(
org.apache.activemq:type=Broker+
brokerName=localhost+
连接器=客户端连接器+
connectorName=openwire+
connectionViewType=clientId+
“connectionName=*”
);
最终MBeanServerConnection mbsc=connector.getMBeanServerConnection();
最终集合名称=mbsc.queryNames(connectionName,null);
for(最终对象名称:名称){
System.out.println(name.getCanonicalName());
}

在最新版本的ActiveMQ(5.1x.x)中,您可以使用获取传输连接器的映射:

Map<String, String[]> env = new HashMap<>();
String[] creds = {brokerUsername, brokerPassword};
env.put(JMXConnector.CREDENTIALS, creds);

final String managementURL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
try (JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(managementURL, env)) {
   ObjectName on = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost");
   BrokerViewMBean broker = MBeanServerInvocationHandler.newProxyInstance(connector.getMBeanServerConnection(), on, BrokerViewMBean.class, false);
   Map<String, String> transportConnectors = broker.getTransportConnectors();
   // broker.getTransportConnectorsByType("tcp"); // openwire
   // broker.addConnector(String discoveryAddress);
   // broker.removeConnector(String connectorName);
 } catch (MalformedObjectNameException ex) {
    // log error
 } catch (IOException ex) {
    // log error
 } catch (Exception ex) {
    // log error
 }
Map env=new HashMap();
字符串[]creds={brokerUsername,brokerPassword};
环境put(JMXConnector.CREDENTIALS、creds);
最后一个字符串managementURL=“服务:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
try(JMXConnector connector=JMXConnectorFactory.connect(新的JMXServiceURL(managementURL,env)){
ObjectName on=newobjectname(“org.apache.activemq:type=Broker,brokerName=localhost”);
BrokerViewBean broker=MBeanServerInvocationHandler.newProxyInstance(connector.getMBeanServerConnection(),on,brokerViewBean.class,false);
Map transportConnectors=broker.getTransportConnectors();
//getTransportConnectorsByType(“tcp”);//openwire
//addConnector(字符串发现地址);
//removeConnector(字符串connectorName);
}捕获(格式错误的ObjectNameException ex){
//日志错误
}捕获(IOEX异常){
//日志错误
}捕获(例外情况除外){
//日志错误
}
也看看


然而,尽管在
BrokerViewMBean
中有一些方法可以获取传输连接器,如上面的代码所示,但是没有任何方法可以获取网络列表(也称为代理到代理)连接器。

有人能告诉我如何正确设置代码格式吗?SHIFT+ENTER会创建一个新的块代码,也可以输入…请参阅或使用编辑器中的工具栏按钮。此答案对于ActiveMQ 5.7.0及之前的版本是正确的。ActiveMQ 5.8.0中更改了ObjectName的格式,如中所述。