MBean服务器位于JMX的3层架构中的代理层,它是代理层的核心,负责完成代理层的主要功能。
MBean服务器管理着MBean的生命周期,即注册和注销,并向MBean提供各类服务,包括动态加载 (Advanced Dynamic Loading)服务、监视(Monitor)服务、定时器(Timer)服务和关联(Relation)服务。
MBean服务器和它所代理的MBean所驻留的 Java虚拟机被称作代理端(Agent Side),而管理应用所驻留的Java虚拟机被称作管理端(Manage Side)。管理端对代理端的访问多为远程访问,而MBean服务器对其代理的MBean的访问都是本地访问。
a)Object Name
Object Name是MBean的唯一标识,它在MBean向MBean服务器中注册时指定。管理应用可以通过这个标识来寻址MBean。Object Name体现了MBean服务器关于MBean的命名机制,这一机制是管理应用和MBean之间实现松耦合的关键。Object Name的语法如下:
[domainName]:property=value[,property=value]*
可以看到,Object Name由两部分组成:域名和一组关键属性,具体说明如下。
- 域名(Domain Name)
关于域名的命名和Java包的约定一致,即“反向的DNS名 + 组织自定义的字串”。比如由网秦公司开发的MBean,其DNS名是netqin.com,则其域名格式是com.netqin.MyDomain。
- 关键属性(Key Properties)
关键属性是一些Key-value对,通过它们可以为MBean在指定的域中添加包括名字、类型和说明等属性,但这些属性可以不是MBean的实际属性。
几个Object Name的实例:
MyDomain:description=Printer,type=laser
DefaultDomain:description=Disk,capacity=1
b)协议适配器和连接器
MBean服务器依赖于协议适配器和连接器来和运行该代理的Java虚拟机之外的管理应用程序进行通信。协议适配器通过特定的协议提供了一张注册在MBean服务器的管理构件的视图。例如,一个HTML适配器可以将所有注册过的管理构件显示在Web 页面上。不同的协议,提供不同的视图。
连接器还必须提供管理应用一方的接口以使代理和管理应用程序进行通信,即针对不同的协议,连接器必须提供同样的远程接口来封装通信过程。当远程应用程序使用这个接口时,就可以通过网络透明的和代理进行交互,而忽略协议本身。
适配器和连接器使MBean服务器与管理应用程序能进行通信。因此,一个代理要被管理,它必须提供至少一个协议适配器或者连接器。面临多种管理应用时,代理可以包含各种不同的协议适配器和连接器。
当前已经实现和将要实现的协议适配器和连接器包括:
HTTP连接器
c)代理服务(Agent Service)
MBean服务器提供给注册MBean的服务被称作JMX代理服务,它们本身也被封装成MBean的形式。代理服务位于JMX架构中的代理层。
代理服务主要包括四类:动态加载(Advanced Dynamic Loading)服务、监视(Monitor)服务、定时器(Timer)服务、关联(Relation)服务。
1)动态加载服务
动态类装载是通过m-let(management applet)服务来实现的,它可以从网络上的任何URL处下载并实例化管理构件,然后向MBean服务器注册。在一个M-let服务过程中,首先是下载一个m-let文本文件,该文件是XML格式的文件,文件的内容标识了管理构件的所有信息,比如构件名称、在MBean服务器中唯一标识该构件的对象名等。然后根据这个文件的内容,创建并注册该文件中所指定的每个 MBean 的实例。
2)监视服务
监视MBean的属性变化,当属性值的变化超出预定义的范围时,相应地发出通知。根据所监视的属性,JMX定义了三类监视器。
根据粒度周期指定的区间监视 observed 属性
每当派生的测量值的值超过配置阈值,Monitor MBean就产生一个JMX通知。这些通知使用一个MonitorNotification类的实例发送,该类是Notification类的子类。该类包含诸如通知类型、被观测的MBean名字、被观测的属性名字、派生的测量值以及触发通知的阈值。与正在使用的监视程序类型相关的监视程序的通知类型有:
jmx.monitor.counter.threshold:当CounterMonitor的派生的测量值达到或超过配置阈值时,产生该通知 。
jmx.monitor.gauge.high:当GaugeMonitor的派生的测量值达到或超过配置阈值上限时,产生该通知 。
jmx.monitor.gauge.low:当GaugeMonitor的派生的测量值减少到或低于配置阈值下限时,产生该通知 。
jmx.monitor.string.matches:当StringMonitor的派生的测量值第一次与所比较的配置字符串匹配时,产生该通知 。
jmx.monitor.string.differs:当StringMonitor的派生的测量值第一次与所比较的配置字符串不相同时,产生该通知 。
当遇到特定的出错条件时,也会产生通知。错误类型的常见集合为:
jmx.monitor.error.mbean:当被观测的MBeans之一未在MBean服务器上注册时,产生该通知。
jmx.monitor.error.attribute:当被观测的属性在某个MBeans中不存在时,产生该通知 。
jmx.monitor.error.type:当被观测的属性值是null或属性类型与正在使用的监视程序类型不匹配时,产生该通知 。
jmx.monitor.error.runtime:当获取被观测属性值的过程中遇到其它错误时,产生该通知 。
jmx.monitor.error.threshold:当配置的阈值参数与被观测属性类型不相同时,计数器监视程序或测量值监视程序产生该通知 。
3)定时器服务
时间服务可以在制定的时间和日期发出通告,也可以定期的周期性的发出通告,依赖于管理应用程序的配置。时间服务也是一个管理构件,它能帮助管理应用程序建立一个可配置的备忘录,从而实现智能管理服务。
JMX Timer服务以两种不同的方式产生通知:
与监视程序MBean类似,Timer MBean在MBeanServer上创建,并进行配置以产生这些定时通知。Timer MBean产生的通知使用TimerNotification类的实例进行发送。若要创建通知,可以使用Timer MBean的addNotification()方法,该方法需要以下的一些或全部参数:
type:用于表示通知类型的字符串 。
message:用于发送关于通知的详细信息的字符串。
userData:可选的回传对象 。
date:用于指定通知应当何时发生的日期类 。
period:通知之间以毫秒为单位的时间间隔(0或null表示无重复的通知) 。
nbOccurences:通知将要发生的总次数(0或null意味着,如果周期是0或null则该通知无限次地重复)。
JMX规范定义了管理构件之间的关系模型。一个关系是用户定义的管理构件之间的N维联系。
关系模型定义如下一些术语:
在关系服务中,管理构件之间的关系由通过关系类型确定的关系实例来维护。仅仅只有注册到MBean服务器上并且能被对象名标识的管理构件才能成为一个关系的成员。关系服务从来就不直接操作它的成员--管理构件,为了方便查找它仅仅提供了对象名。
关系服务能锁定不合理关系类型的创建,同样,不合理的关系的创建也会被锁定。角色值的修正也要遵守一致性检查。
由于关系是定义在注册的管理构件之间的联系,所以当其中的管理构件卸载时,就会更改关系。关系服务会自动更改角色值。所有对关系实例的操作比如创建、更新、删除等都会使关系服务发出通告,通告会提供有关这次操作的信息。
JMX关系模型只能保证所有的管理构件满足它的设计角色,也就是说,不允许一个管理构件同时出现在许多关系中。