如何创建可以使用不同的服务URL与多个jmx服务器交互的JMX客户端



我正在使用Spring jmx来创建jmx客户端,该客户端可以与集互Cassandra以获取mbean对象属性Livedicsspaceused。

因此,这个Cassandra集群有 3 个节点,因此有不同的 serviceUrl(每个都有不同的 IP 地址)。

现在我意识到在创建 MBeanServerConnectionFactoryBean bean 时,我只能指定一个服务 URl,如下所示:

@Bean 
MBeanServerConnectionFactoryBean getConnector() {
    MBeanServerConnectionFactoryBean mBeanfactory = new MBeanServerConnectionFactoryBean();
    try {
        mBeanfactory.setServiceUrl("serviceUrl1");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    mBeanfactory.setConnectOnStartup(false);
    return mBeanfactory;
}

然后主要我正在访问它,如下所示:

objectName = newObjectName(QueueServicesConstant.MBEAN_OBJ_NAME_LIVE_DISC_USED);
long count = (Long)mBeanFactory.getObject().getAttribute(objectName, QueueServicesConstant.MBEAN_ATTR_NAME_COUNT);

如何在所有三个节点中获取此值?

您需要 3 个不同的连接器。

或者你可以使用Jolokia Proxy之类的东西来访问多个服务器(使用REST而不是JSR 160)。

这就是我解决问题的方式..我没有使用Spring-JMX,而是直接使用javax.management apis。因此,我下面的代码将获得任何一个连接器,这些连接器足以为我提供正确的属性值,但是如果无法从一个服务器节点获取连接器,它将尝试连接到ohther节点。

@SuppressWarnings("restriction")
private Object getMbeanAttributeValue(String MbeanObectName,
        String attributeName) throws IOException,
        AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException, MalformedObjectNameException {
    Object attributeValue = null;
    JMXConnector jmxc = null;
    try {
        State state = metaTemplate.getSession().getState();
        List<String> serviceUrlList = getJmxServiceUrlList(state
                .getConnectedHosts());
        jmxc = getJmxConnector(serviceUrlList);
        ObjectName objectName = new ObjectName(MbeanObectName);
        MBeanServerConnection mbsConnection = jmxc
                .getMBeanServerConnection();
        attributeValue = mbsConnection.getAttribute(objectName,
                attributeName);
    } finally {
        if (jmxc != null)
            jmxc.close();
    }
    return attributeValue;
}
// This will provide any one of the JMX Connector of cassandra cluster
@SuppressWarnings("restriction")
private JMXConnector getJmxConnector(List<String> serviceUrlList)
        throws IOException {
    JMXConnector jmxc = null;
    for (String serviceUrl : serviceUrlList) {
        JMXServiceURL url;
        try {
            url = new JMXServiceURL(serviceUrl);
            jmxc = JMXConnectorFactory.connect(url, null);
            return jmxc;
        } catch (IOException e) {
            log.error(
                    "getJmxConnector: Error while connecting to JMX sereice {} ",
                    serviceUrl, e.getMessage());
        }
    }
    throw new IOException(
            "Not able to connect to any of Cassandra JMX connector.");
}

相关内容

  • 没有找到相关文章

最新更新