GlassFish广泛地应用了JMX技术。除了通过AMX来简化对MBean的访问外,GlassFish还提供了对JMX的消息和监控方面的扩展。
本章将先介绍从JMX的消息机制衍生而来的自管理(Self Management)技术,接着将介绍GlassFish的另一个JMX扩展:内置的性能探查器CallFlow。
本章重点:
l 自管理的管理规则
l 自管理的实现和开发
l CallFlow的架构
l CallFlow应用
16.1 自 管 理
GlassFish的自管理技术为用户深入、灵活地进行应用服务器的管理提供了便捷的途径。
16.1.1 自管理概述
自管理技术的核心是管理规则(Management Rule)的定制。管理规则由用户自定义,描述的是在何种事件触发时完成何种相应的处理。管理规则交由系统去执行,系统执行所依赖的正是JMX的事件机制。
自管理技术是为了使应用服务器的架构更加开放和可扩展。它包括:
l 自调整(Self-tuning)。
l 自配置(Self-configuring)。
l 自恢复(Self-healing)。
自管理应用的特点是高度可定制化。何时触发以及如何管理都可以由用户自行定制。这种定制是通过系统或自行创建的MBean来实现的。通过自管理技术,用户可以更深入地参与系统的管理。典型的自管理应用包括以下几方面的内容。
(1) 数据库连接过多时,对Connector/JDBC连接池的自动调整和配置。
(2) EJB性能下降时,对ORB线程池的自动调整和配置。
(3) 负载过大时,挂起实例和线程。
(4) Web请求过多时,对Web容器线程池Thread Pool的自动调整和配置。
(5) JVM参数的自动优化。
(6) 日志文件过大时进行各种磁盘管理。
(7) MQ中出现死亡队列消息(Dead Queue Message)时,发出警告。
(8) 内存泄漏或内存不足时,发出警告。
16.1.2 管理规则与JMX消息机制
管理规则是自管理执行的依据。管理规则由用户通过管理控制台或命令行工具asadmin预先设定。管理规则将一个事件(Event)和一个动作(Action)进行了绑定,它描述了当某事件发生时所要对应执行的动作,如图16-1所示。

图16-1 管理规则示意图
事件和动作是管理规则的两部分,事件定义的是什么时候做,动作定义的是做什么。管理规则和JMX技术密切关联,它可以看成是JMX的消息(Notification)机制实现的翻版:管理规则涉及两个MBean,一个是发出事件的MBean(称作Event MBean),另一个是完成动作的MBean(称作Action MBean),二者被管理规则关联在一起。这两个MBean都是普通的MBean,唯一的要求是实现动作的MBean需实现JMX接口javax.management.NotificationListener。
管理规则之所以可以轻松地描述MBean之间的事件,是因为有JMX标准的支撑。Event MBean和Action MBean之间的关系类似Java Bean事件机制中的Event Source和Listener之间的关系,Java Bean事件机制中Event Source需要维护一个Listener的列表,而因为MBean服务器统一维护着各个MBean实例,所以自管理省略了这一过程。此外,标准的JMX消息接口也使得执行动作的MBean不必为各类事件实现不同的接口。
16.1.3 管理规则的定义和实例
各个管理规则都被以XML的形式存放在domain.xml文件中。针对不同的事件,管理规则有着不同的语法要求。
【例16.1】一个计数器监视器的管理规则:
<management-rule name="Rule2" enabled="true">
<event level="INFO" record-event="true" type="monitor">
<property name="monitortype" value="countermonitor"/>
<property name="initthreshold" value="10"/>
<property name="numbertype" value="long"/>
<property name="observedmbean" value="EntityStatsMBean"/>
<property name="observedattribute"
value="ReadyCount.highWaterMark"/>
</event>
<action action-mbean-name="CustomBean"/>
</management-rule name>
【例16.2】一个LifeCycle事件的管理规则:
<management-rule name="Rule3" enabled="true">
<event level="INFO" record-event="true" type="lifecycle">
<property name="name" value="termination"/>
</event>
<action action-mbean-name="CustomBean"/>
</management-rule name>
有关管理规则的完整定义,请参见例16.3所示的DTD Schema。
【例16.3】管理规则的DTD Schema:
<!ELEMENT config
(http-service, iiop-service, admin-service, connector-service?, web-container,
ejb-container, mdb-container, jms-service?, log-service, security-service,
transaction-service, monitoring-service, java-config, availability-service?,
thread-pools, alert-service?, management-rules, system-property*,
property*)>
<!-- self management rules的容器(Container)
enabled:更高级别地禁用全部规则。如果是false,所有的规则被禁用,如果是true,则交由具体规则的设定来决定是否启用
-->
<!ELEMENT management-rules(management-rule*)>
<!ATTLIST management-rules
enabled %boolean; "true"
>
<!—定义self management规则的要素:
name management
rule名
enabled 是否启用规则,默认是false
action-mbean-ref Action MBean的名称
-->
<!ELEMENT management-rule (event, properties*) >
<!ATTLIST management-rule
name
CDATA #REQUIRED
enabled
%boolean; "true"
action-mbean-ref
CDATA #REQUIRED
>
<!-- 定义规则相应的event。每个规则都有一个event -->
<!ELEMENT event (properties*) >
<!ATTLIST event
type %event_type #IMPLIED
>
<!-- event类型 -->
<!ENTITY %event_type
"(log | timer | trace | monitor | gms | lifecycle |
notification)"
>
管理规则重点描述如何指定Event。下面对此重点介绍。
16.1.4 自管理的事件(Event)
管理规则中的事件必须是JMX的消息。管理规则支持的事件被分为以下3类。
l 监控事件(Monitor Event):JSR-77所定义的Java EE各部件的可统计的属性所触发的事件。
l JMX消息(JMX Notification):这里特指自定义MBean所发出的事件。此类MBean需实现JMX接口javax.management.NotificationBroadcaster和NotificationEmitter。
l 预定义事件(Predefined Event):这其中又包括Lifecycle Event、Log Event、Timer Event、Trace Event。
每个事件都会要求不同的动作和配置来完成管理规则。进一步的说明请看表16-1。
表16-1 自管理关键字段说明
|
特 性 |
字 段 |
说 明 |
|
Monitor Event |
Observed MBean |
MBean的对象名,其格式如下: domain:type=implementation-class-name, name=implementation-class-name |
|
Observed Attribute |
要监控的MBean属性 |
|
|
Granularity Period |
间隔时间。用于周期性地获取属性 |
|
|
monitor type |
监控器可以是以下三种类型: ——计数(Count)型监控器,当数值变更幅度超出预设时被触发 ——尺度(Gauge)型监控器,当数值超出预设的上下限时被触发 ——字符串(String)型监控器,当字符串变更时被触发 |
续表
|
特 性 |
字 段 |
说 明 |
|
Notification Event |
Class Name |
自定义MBean的类名 |
|
notification type |
Notification类型 |
|
|
Lifecycle Event |
Event |
GlassFish组件的生命周期事件,包括Ready、Shutdown 和Termination |
|
Log Event |
Logger |
日志接口的类名 |
|
level |
日志级别 |
|
|
Timer Event |
Date String |
规则有效的开始日期 |
|
Pattern |
要搜索的模式,默认模式为mm/dd/yyyy hh:mm:ss |
|
|
Period |
消息发送给MBean的间隔时间 |
|
|
Number of Occurrence |
在消息中模式匹配出现的次数 |
|
|
Message |
当模式匹配上时,写入日志的信息 |
|
|
Trace Event |
event |
由CallFlow触发的事件。具体包括以下类型。 ejb_component_method_entry:将调用EJB的business方法 ejb_component_method_exit:结束执行EJB business方法 web_component_method_entry:将调用Web服务 web_component_method_exit:Web服务结束执行 request_start:服务器收到新的HTTP或IIOP请求 request_end:HTTP或IIOP请求结束 |
16.1.5 创建管理规则
管理规则的定制可以通过管理控制台和命令行进行。
命令行工具asadmin关于管理规则的子命令如下。
(1) 创建管理规则:
asadmin>create-management-rule –action <action-mbean-name> --eventtype <monitor|notification|timer|log|gms|trace|lifecyle> [--eventproperties (property=value[:property=value]*)] [--config <config>] <rule-name>
(2) 删除管理规则:
asadmin>delete-management-rule [--config <config>] <rulename>
(3) 列举管理规则:
asadmin>list-management-rules [config]
管理控制台提供了图形化的向导来完成管理规则的定制。此向导分成两步完成,第一步指定规则中的事件,第二步根据事件类型完成动作和相关配置。
16.1.6 自管理的实现代码
自管理的代码实现位于Admin模块中,相关代码提示请参见表16-2。
表16-2 自管理代码阅读提示
|
想了解 |
请查看 |
|
自管理实现文件位置 |
com.sun.enterprise.admin.selfmanagement |
|
管理规则中相关的Event和 Listener接口 |
com.sun.enterprise.admin.selfmanagement.event |
|
如何生成各类event |
com.sun.enterprise.admin.selfmanagement |
|
如何执行管理规则并提供自管理服务 |
com.sun.enterprise.management.selfmanagement |
|
管理控制台界面如何定制管理规则 |
com.sun.enterprise.tools.admingui.handlers.ManagementRulesHandler |
|
如何处理管理规则的增删改 |
com.sun.enterprise.management.selfmanagement.reconfig |
|
如何记录自管理的相关信息 |
com.sun.logging.enterprise.system.core.selfmanagement |
|
TraceEvent的组成 |
com.sun.enterprise.admin.selfmanagement.event.TraceEventImpl |







