镜像系统的硬盘扩容方案(11)
4 . MBeanServerFactory
MBeanServerFactory 是产生 MBeanServer 的工厂类,使用的 JMX 实现工具不同,通过 MBeanServerFactory 创建的 MBeanServer 实现对象也不同。如果 MBeanServer 已经被创建了,那么可以通过下面的方法获取:
5 .用户查询 MBean
首先,确定 MBean 的接口。
用户查询 MBean 中的用户是这个 MBean 所代表的对象,这个设计的用户包括名称和角色,在这个例子中将对这两个属性进行监控,这是 JMX 为开发者提供的一种机制,所有被管理的 MBean 都在 MBeanServer 的控制之中,这个控制不仅包括上个计数器实例中所演示的方法调用功能,也包含对这些 MBean 的相关信息进行考察的功能。
JMX API 为查询服务建立标准的接口方法,第一步是建立查询表达式:
然后,通过一个 MBean 名称对象来代表查询范围:
MBeanServerFactory 是产生 MBeanServer 的工厂类,使用的 JMX 实现工具不同,通过 MBeanServerFactory 创建的 MBeanServer 实现对象也不同。如果 MBeanServer 已经被创建了,那么可以通过下面的方法获取:
通过这个实例,可以了解到使用 MBeanServer 来控制 MBean 的基本方法,下面的 用户查询 MBean 将进一步介绍通过 MBeanServer 对 MBean 的属性进行查询的方法。MBeanServer server = MBeanServerFactory.newMBeanServer();
5 .用户查询 MBean
首先,确定 MBean 的接口。
用户查询 MBean 中的用户是这个 MBean 所代表的对象,这个设计的用户包括名称和角色,在这个例子中将对这两个属性进行监控,这是 JMX 为开发者提供的一种机制,所有被管理的 MBean 都在 MBeanServer 的控制之中,这个控制不仅包括上个计数器实例中所演示的方法调用功能,也包含对这些 MBean 的相关信息进行考察的功能。
UserMBean 中被设定了两个属性: name 和 role ,并遵照 Java Bean 的规则为它们提供了 get() 和 set() 方法。通过这两个方法可以设定 UserMBean 的两个属性。package com.liuyang.jmx.mbeans.user;
public interface UserMBean {
public String getName();
publicvoid setName(String name);
public String getRole();
public void setRole(String string);
}
User 这个类只是以最简单的方式实现了 UserMBean 接口。下面 的 UserQueries 演示了 通过 MBeanServer 对 MBean 的属性进行查询的方法,代码如下:package com.liuyang.jmx.mbeans.user;
public class User implements UserMBean {
private String name = "";
private String password = "";
private String role = "";
public String getName() {
return name;
}
publicvoid setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String string) {
role = string;
}
}
在 UserQueries 中创建了两个 MBean 对象:package com.liuyang.jmx.mbeans.user;
import java.util.Iterator;
import java.util.Set;
import javax.management.Attribute;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.Query;
import javax.management.QueryExp;
public class UserQueries {
publicstaticvoid main(String[] args) throws Exception {
MBeanServer server = MBeanServerFactory.createMBeanServer();
ObjectName user1 = new ObjectName("book.liuyang:Name=user1");
ObjectName user2 = new ObjectName("book.liuyang:Name=user2");
server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);
server.createMBean("com.liuyang.jmx.mbeans.user.User", user2);
server.setAttribute(user1, new Attribute("Name", "user1"));
server.setAttribute(user2, new Attribute("Name", "user2"));
server.setAttribute(user1, new Attribute("Role", "code"));
server.setAttribute(user2, new Attribute("Role", "test"));
QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));
ObjectName scope = new ObjectName("book.liuyang:*");
Set set = server.queryNames(scope, exp);
Iterator it = set.iterator();
System.out.println(" 下列 MBean 的名字是: user1");
while (it.hasNext()) {
System.out.println(it.next());
}
scope = new ObjectName("book.liuyang:*");
exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));
set = server.queryNames(scope, exp);
it = set.iterator();
System.out.println(" 下列 MBean 的角色是: test");
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
这是 MBeanServer 通过 MBean 类的名称创建 MBean 实例的方法。然后分别设置它们的属性:server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);
一个 Attribute 对象代表一个属性。server.setAttribute(user1, new Attribute("Name", "user1"));
JMX API 为查询服务建立标准的接口方法,第一步是建立查询表达式:
这个查询表达式是以全匹配的方式进行的, JMX 还支持部分模糊查询的功能:QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));
initialSubString 建立的查询方法只会匹配名称的开始部分,在这里只要以“ t ”开头的值都会被匹配。exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));
然后,通过一个 MBean 名称对象来代表查询范围:
最后,通过 MBeanServer 执行查询表达式的操作,得到结果:ObjectName scope = new ObjectName("book.liuyang:*");
运行 UserQueries 可以得到查询结果。Set set = server.queryNames(scope, exp);
0
相关文章