JBoss4采用JMX作为它的核心框架,JMX构成了一个服务总线体系,所有对服务的调用都通过此总线进行分发。
MbeanServer
下面是一个MbeanServer的关系图
从图中可以看出,MBeanServer持有一个MBean注册表,所有的MBean都必须登记到注册表中,

从图中可以看出,MBeanServer持有一个MBean注册表,所有的MBean都必须登记到注册表中,
一个服务操作的执行过程
下图是一个服务操作的执行序列图

XMBean
XMBean是Xml MBean的缩写,即通过xml文件描述的MBean,下面是jboss-service.xml中JNDIView的mbean定义.
<mbean code="org.jboss.naming.JNDIView"
name="jboss:service=JNDIView"
xmbean-dd="resource:xmdesc/JNDIView-xmbean.xml">
<attribute name="HANamingService">jboss:service=HAJNDI</attribute>
</mbean>
其中: code指定服务组件的类名称或MBean的类名称;
name指定服务组件在注册表中的名称,必须是唯一的;
xmbean-dd指定mbean的xml描述文件;
下表列出了xmbean-dd和interface不同取值组合下mbean和service的实际类型;
mbean
类型
|
service
类型
|
xmbean-dd
|
interface
|
xmbean
定义
|
StandardMBean
|
code指定
|
null
|
not null
|
not used
|
code指定
|
|
null
|
null
|
not used
|
XMBean
|
code指定
|
length=0
|
not used
|
内置
|
XMBean
|
code指定
|
length>0
|
not used
|
xml文件
|
ServiceCreator根据mbean节点创建xmbean,然后登记到registry中。
----- BasicMBeanRegistry.java -----
public
ObjectInstance registerMBean(Object object,
ObjectName name, Map valueMap) {
// 1.取得MBeanInvoker
MBeanCapability mbcap = MBeanCapability.of(object.getClass());
int mbeanType = mbcap.getMBeanType();
if (mbeanType == MBeanCapability.STANDARD_MBEAN) {
invoker = new XMBean(object, XMBeanConstants.STANDARD_MBEAN);
} else if (object instanceof MBeanInvoker) {
invoker = (MBeanInvoker)object;
} else if (mbeanType == MBeanCapability.DYNAMIC_MBEAN) {
if( object instanceof RequiredModelMBean )
invoker = new RequiredModelMBeanInvoker((DynamicMBean)object);
else
invoker = new RawDynamicInvoker((DynamicMBean)object);
}
// 2.创建MBeanEntry并登记
MBeanEntry entry = new MBeanEntry(regName, invoker, object, valueMap);
add(entry);
// ......
}