1

我正在使用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);

我怎样才能在所有三个节点中获得这个值?

4

2 回答 2

1

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

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

于 2016-02-03T14:29:18.880 回答
0

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

@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.");
}
于 2016-02-04T02:16:50.363 回答