【问题标题】:ActiveMQ: Get list of connections through JMX?ActiveMQ:通过 JMX 获取连接列表?
【发布时间】:2011-11-17 21:44:11
【问题描述】:

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

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

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

ObjectName name = new ObjectName("org.apache.activemq:BrokerName=localhost,Type=Connection,ConnectorName=openwire"); 
mbsc.getMBeanInfo(name); 
ConnectorViewMBean view = JMX.newMBeanProxy(mbsc, name, ConnectorViewMBean.class);

【问题讨论】:

    标签: java activemq jmx


    【解决方案1】:

    解决方案是使用表达式:

    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()); 
    } 
    

    【讨论】:

    • 谁能告诉我如何正确格式化代码?? SHIFT + ENTER 创建一个新的块代码,也可以 ENTER ...
    • 查看stackoverflow.com/editing-help 或使用编辑器中的工具栏按钮
    • 这个答案对于 ActiveMQ 5.7.0 及之前版本是正确的。 ObjectName 的格式在 ActiveMQ 5.8.0 中发生了变化,如 5.8.0 release notes 中所述。
    【解决方案2】:

    我正在使用 ActiveMQ 5.14.5,它使用不同的 ObjectName 格式通过 JMX 查询连接。在这个版本的 ActiveMQ 中,相当于Andrew's answer 的是:

    final JMXServiceURL url       = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
    final JMXConnector  connector = JMXConnectorFactory.connect(url, null);
    connector.connect();
    
    final ObjectName connectionName = new ObjectName(
        "org.apache.activemq:type=Broker," +
        "brokerName=localhost,"            +
        "connector=clientConnectors,"      +
        "connectorName=openwire,"          +
        "connectionViewType=clientId,"     +
        "connectionName=*"
    );
    
    final MBeanServerConnection mbsc  = connector.getMBeanServerConnection();
    final Set<ObjectName>       names = mbsc.queryNames(connectionName, null);
    for (final ObjectName name : names) {
        System.out.println(name.getCanonicalName());
    }
    

    【讨论】:

      【解决方案3】:

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

      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
       }
      

      查看ConnectorViewMBean

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

      【讨论】:

        猜你喜欢
        • 2021-06-15
        • 1970-01-01
        • 2020-02-17
        • 2018-10-27
        • 2016-07-15
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 2015-05-31
        相关资源
        最近更新 更多