Java事件处理模式(2)
发布时间:2010/11/24 17:42:34 来源:www.xue.net 编辑:城市总裁吧
监控式事件模式
监控式事件模式就不同于事件直接驱动模式,它是借助第三者来监控和触发事件,这类事件的特点是: 有一个观察者置身事外在定期独立运行着,我们将我们要监听的事件向这个观察者注册,这样观察者就 代替我们来监听这个事件,应用客户端通过观察者来获得事件状况。
应用客户端有三种与观察者交互的方式:1.直接融合 2.推方式 3.拉方式。
直接融合就是说应用客户端自己就是观察者,两者融合,这样无疑应用客户端获得的触发时间是最快的;
推方式就是观察者一旦侦测到事件发生,立即将事件Push推到应用客户端;拉方式类似收取邮件,应用客户端在需要时才从观察者拉取事件。
JDK 1.4的None Blocking I/O是监控式事件模式的典型实现,Selector显然是一个监控I/O的第三者,当有外部事件进来,通过 调用Slector.select方法可以获得外部事件,从而进行处理,可参考我的本栏文章。
监控式事件模式适合使用在触发性质的场合,比如数据库后端触发器 界面触发 I/O触发 状态改变触发等。
我们以一个信件触发为例,这其实是个Observer应用例子:
比如用户提请服务器计算一个数据,如果用户同时要求将计算结果向自己信箱发一封,那么我们看如何设计? 按照通常思维,这是一个次序问题,先在内存中计算数据,然后将结果发送到他的信箱,最后返回结果到用户端, 我们知道信件的发送是耗时的,因此,有可能网络的原因造成信件发送很慢,这是用户就一直等不到他的计算结果, 很显然,我们使用监控式事件模式来解决,让发信的事件由监控者去完成,只要需要时触发就可以了:
public class Computer extends Observable{
public Computer(){
//将sendMailObserver设定为本类的观察者。
addObserver(new sendMailObserver());
}
.......
public void compute(String input,boolean needEmail,String email){
//计算操作
.........
if (needEmail){
//设置变化点
setChanged();
//如果需要发送email,我们把email地址作为参数传送过去
notifyObservers(email);
}
}
}
我们再来看监控观察者代码是如何写的?
public class sendMailObserver implements Observer{
public void update(Observable obj,Object email){
if (email instanceof String){
sendMail(email);
}
}
}
这样服务器在执行compute方法时,就没有发送邮件的等待,一直接继续执行。
监控式事件模式和事件直接驱动模式可以在一个系统一起使用,外界信号通过事件直接驱动模式启动系统处理模块, 系统处理模块处理过程中,可以通过监控式事件模式来触发其它后台任务。这样一个架构非常适合实时处理系统。
既然事件处理模式是众多应用系统的基本模式,那么应该可以形成一个框架标准,JMX的notification Model就是这样一个架构设计。
JMX Notification Model
我们知道,JMX是提供了一种对MBean资源执行控制和配置的管理机制,但这只是复杂的,分布式的系统中的一部分, 还有需要资源能够感应状态改变或者特定事件变化的机制,这就是JMX Notification Model。 在JMX Notification Model中均可以实现"事件直接驱动模式"和"监控式事件模式",这取决于你的应用需求。
JMX Notification Model允许MBean通过调用notifications广播事件,接受者只要注册为一个listerner, JMX的 MBean notification model 将会激活这个listerner注册一次,然后将一直接受到 来自广播者发出的各种事件。
事件模式有三个角色,第一个是事件发出者producer 然后是事件接受者Consumer,第三个 是要传输的事件。JMX notification model也是这样分别依靠下列组件来实现这三个角色:
A. NotificationBroadcaster接口, 事件广播发出者, 这个接口允许监听者在需要发出的notification中注册他们感兴趣的事件。
B. 通用事件(Notification),这是我们要传输的事件。 Notification事件能被直接使用,也能成为子类,这些都依赖于随同事件传输的信息。 通过使用通用事件类型,监听者将能接受来自广播者所有类型的事件。
C. NotificationListener接口, 事件监听者或者接受者, 用于接受来自广播者的任何notification信号。
D. NotificationFilter接口, 这个接口为notification的监听者提供一个对发出事件的过滤器。
E. NotificationEmitter 接口, 扩展了NotificationBroadcaster接口,当删除监听者时允许更多的控制功能。