如何创建可以使用不同的 serviceUrl 与多个 jmx 服务器交互的 JMX 客户端
How to create JMX client which can interect with multiple jmx server using different serviceUrl
我正在使用 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 api..所以我下面的代码将获得任何一个连接器足以为我提供正确的属性值,但是如果无法从一个服务器节点获取连接器,它将尝试连接到其他节点。
@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.");
}
我正在使用 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 api..所以我下面的代码将获得任何一个连接器足以为我提供正确的属性值,但是如果无法从一个服务器节点获取连接器,它将尝试连接到其他节点。
@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.");
}