旅行

总是走在漫长的路上...

转载 jmx入门6-消息(Notifications)收藏

消息(Notifications)

总的来说,在管理者(一个管理者可能是协议适配器或者其他监听消息的MBean),JMX代理和已管理资源之间的通信,将

步骤1.管理者提出请求 步骤2.JMX代理转发请求到已管理资源并从已管理资源获得信息 步骤3.JMX代理送回被管理者接收的响应.

这里有一些特别的场景,当有些事件发生时一个JMX代理发送一些信息到管理者.这些事件术语称消息(Notifications);

javax.management.Notification 类

Notification类描述一个由一个MBean发送出来的消息.Notification对象包含以下字段:

Type -- 一个包含小数点的字符串表达式.如Server.started SequenceNumber -- 一个long值表达式系列数字,标志在消息广播上下文中一个特定实例的消息. TimeStamp -- 一个指定何时消息产生的时间戳. Message -- 描述消息的字符串描述. UserData -- 一个哈西表,描述消息广播器希望和它的监听者通信的附加数据.

发送消息

一个MBean或者一个java类能够传送消息,术语称为消息广播者.任何类型的MBean,如标准,动态,模型MBean,都能够广播消息.如一个MBean或者java类广播消息,它必须实现NotificationBroadcaster接口.另一个较简单的方法是MBean或者java类可以扩展NotificationBroadcasterSupport类.NotificationBroadcasterSupport类实现NotificationBroadcaster接口,并提供一个方法叫sendNotification,这个方法带了一个javax.management.Notification 类型的对象.当这个sendNotification方法被调用时,消息将被送到所有注册的监听者.

注册监听者

一个监听者能够是一个MBean或者任意其他实现了NotificationListener接口的对象.

任意数量的监听者都能够被注册到一个消息广播器.一个监听者通过调用广播器上的addNotificationListener 方法注册到广播器.这个方法的语法为

public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)

当上面的方法被调用,监听者对象或者监听者MBean被注册到广播器,作为总多监听者的一员.当sendNotification方法被调用时,在注册期间监听者MBean将被原样随同消息传回这个对象已被使用..(The Object handback that is used while registering the listener MBean will be sent unmodified along with the Notification when sendNotification is invoked.)

一个监听者在一个广播者中仅能注册一次.要在相同的广播者上注册超过一次,那么对象传回通过当调用addNotificationListener 应该不同.(For registering it more than once with the same broadcaster, then the Object handback passed while invoking the addNotificationListener should be different.)

接收消息

任何对象或者MBean都能够接受任意MBean发送的消息. 为达到这个目的,对象或者MBean将

  • 注册自己为监听者一员到将接收消息的MBean或者java类.
  • 实现NotificationListener接口.

注册对象或者MBean为监听者一员,参考上面提供的"注册监听者"小节.

实现NotificationListener 接口:

NotificationListener接口只有一个方法叫handleNotification.这个方法的语法为

public void handleNotification(Notification notif, Object handback)

这个方法是个回调方法.当方法sendNotification被调用,广播者发送一个消息到所有已经注册的监听者,每一个监听者的handleNotification方法也被调用.所获得的传回对象将是那个已经被使用在addNotificationListener方法的对象.

过滤消息

当一个消息监听者被自己注册到消息广播者后,任意这个广播者发送的消息都能够接受到.可能有这样的情况,这个监听者只想从广播者接收特定的消息 .

这种情况由当注册监听者到消息广播者时,定义一个消息过滤器并传递它来实现.任何实现NotificationFilter接口的对象都可以作为消息过滤器. NotificationFilter 接口定义一个唯一的方法 isNotificationEnabled ,方法的语法为

public boolean isNotificationEnabled(Notification notif)

比较简易的创建消息过滤器的方法时继承 NotificationFilterSupport 类.NotificationFilterSupport 具有已经定义的方法象 disableType(String type) 和 enableType(String type) .因此,通过 在消息过滤器对象调用 disableType("Server.restart") ,类型 Server.restart 的消息将不被接收.

消息机制

  • 一个消息的产生通过在消息广播者MBean上调用 sendNotification 方法产生.
  • 消息广播者检查注册在它自身的消息监听者列表.
  • 对于每一个已注册的监听者,它检查是否有实施的过滤器,如它调用 isNotificationEnabled(Notification notif).
  • 如果isNotificationEnabled返回false , 那么没有消息发送到此监听者.
  • 如果isNotificationEnabled返回true, 那么消息对象随同相应的监听者传回的对象将发送到此监听者.这个传回对象将是那个在调用addNotificationListener(... , ..., Object handback) 已经被赋予的对象.
  • 当一个消息被送到监听者,监听者的handleNotification方法被调用.

需记住的几点

  1. 任意类型的MBean,标准,动态,模型或者非MBean类能够是一个消息广播者,消息监听者或者同时是两者.
  2. 用一个MBean或者java类来作为一个消息广播者,它将实现NotificationBroadcaster接口.简单的方法是继承NotificationBroadcasterSupport.
  3. 用一个MBean或者一个java类作为一个消息监听者,它将实现NotificationListener接口.为接收消息,它将被作为监听者一员注册被注册到消息广播者.
  4. 消息能够被过滤掉,当调用addNotificationListener方法时,通过传递一个消息过滤器实现.
  5. 消息过滤能根据消息类型,或者消息的message消息,或者任意其他东东,取决于怎样实现消息过滤器.
  6. 转换一个消息到指定协议的实现,如SNMP,是协议适配器的职责.
 

发表于 @ 2008年02月17日 06:35:00|评论(loading...)

新一篇: jmx 入门8-什么是MBeanServer  | 旧一篇: jmx 入门7-代理层次

Csdn Blog version 3.1a
Copyright © 张留林