通过JMX获取指定类的ObjectName

通过JMX获取指定类的ObjectName

在JMX的使用场景中,通常是直接通过对应的域名和属性获取对应的下级对象。

此种方式有一定的局限,例如:

org.apache.activemq:BrokerName=mq-70-cluster,Type=Broker

org.apache.activemq:BrokerName=mq-25-cluster,Type=Broker

这是多个MQ的实例,域名一样,但可能根据应用场景,实例的名称并不一样。

如果在根据这个域名字符串去定位对象,是不准确的,且可能获取不到,如果把这样的类似的节点在程序当中列出来,

也是一件极难维护的事情,并不讨巧。

下面这种方式可以通过循环出Mbean中所有的对象,来实现我们想要的功能,在循环的过程中,也可以通过mbean给出的查询过滤器,筛选出我们制定的类对象。

private ObjectName findMqBroker(MBeanServerConnection mbsc) throws IOException{
Set<ObjectInstance> mbSet;
try {
mbSet = mbsc.queryMBeans(null,new Query().isInstanceOf(new StringValueExp("org.apache.activemq.broker.jmx.BrokerView")));
Iterator<ObjectInstance> mbSetIterator = mbSet.iterator();
while (mbSetIterator.hasNext()) {
ObjectInstance objectInstance = (ObjectInstance) mbSetIterator
.next();
return objectInstance.getObjectName();
}
} catch (IOException e) {
throw new IOException(e.getMessage(), e);
}
return null;
}

通过isInstanceOf的Query以及MBean的queryMBeans方法,获取指定Class下的对象。

这样,不论实例名称如何变化,我们都可以通过类的本身,获取单个或者多个实例。

留下回复