Notification介绍
从前两篇文章可以知道,MBean提供的管理接口允许代理对其管理资源进行控制和配置。然而,对管理复杂的分布式系统来说,这些接口只是提供了一部分功能。一般来说,管理应用程序需要对管理的资源进行监控,以便发生一些行为或者状态变化时能够作出相应的反映。
Notification起到了MBean之间的沟通桥梁的作用。JMX Notification模型和Java Event模型类似,将一些重要的信息,状态的转变,数据的变更传递给Notification Listener,以便资源的管理。
JMX的Notification由四部分组成:
- Notification,一个通用的事件类型,该类标识事件的类型,可以被直接使用,也可以根据传递的事件的需要而被扩展。
- NotificationListener,接收通知的对象需实现此接口。
- NotificationFilter,作为通知过滤器的对象需实现此接口,为通知监听者提供了一个过滤通知的过滤器。
- NotificationBroadcaster,通知发送者需实现此接口,该接口允许希望得到通知的监听者注册。
Notification实例
下面写一个具体的例子来演示一下Notification的使用。
假设Jack要与Rose打招呼,Jack会先开口,说”Hello Rose!”,而Rose会听到,下面看一下Jack的MBean:
|
|
只有一个sayHello
方法,看一下它的实现类:
|
|
Jack在打完招呼后创建了一个Notification
对象用来传递一个通知。
|
|
Rose的MBean只有一个heard
方法来显示听到的内容,实现类如下:
|
|
非常简单,下面创建一个NotificationListener
,作用是在接收到sayHello
方法中传递的通知后应该做什么:
|
|
handleNotification
方法先打印了通知的信息,然后调用rose的heard
方法。将各个MBean注册到MBeanServer
中:
|
|
运行后,在浏览器中输入http://localhost:9999,查看:

点击name=Java

再点击sayHello
按钮,查看控制台,会输出:
|
|
Notification的实现
下面可以看一下具体的源代码来了解一下Notification工作的流程。
在Jack
类中调用了super.sendNotification(notification);
后,会执行NotificationBroadcasterSupport
类中的sendNotification
方法:
|
|
很简单,就是遍历所有注册的listener,然后把notification和listener封装成一个SendNotifJob
对象,在线程池中执行,看一下SendNotifJob
的定义:
|
|
该类实现了Runnable
接口,在run
方法中,调用handleNotification
方法,看一下该方法的实现:
|
|
这里调用了listener的handleNotification
方法,在JackListener
中实现的就是该方法。下面是NotificationListener
接口的定义:
|
|
该接口只有一个方法,同时NotificationListener
继承自java.util.EventListener
,这个接口并没有任何方法的定义,仅仅代表一种类型。
看到这就应该很好理解了,这就是观察者模式的实现,不熟悉的话可以参考一下之前的文章:设计模式:观察者模式,其实还有一个更具体的例子,参考Tomcat源码:生命周期。