1.分布式事件及通知
分布式事件系统有一些与单机系统不同的特点和需要。由于存在网络延迟和失败的可能性,远程对象事件的通知的顺序可能因客户的不同而异,或者根本没有到达。一个通知到达的时间可能会很长,也可能会有这种情况,接收通知的对象一方不总是希望立即得到通知,而是在接收一方决定的一个确定时间得到。甚至可能发生注册兴趣的对象并不是事件通知应发送的对象。
分布式通知的中心概念是在产生通知的对象和希望接收通知的其他对象之间加入第三方对象。它们可以从对象上卸下通知,实现多种传递保证,存储通知,并进行通知的过滤和重新路由。
2.基本接口和类
Jini 技术中分布式事件的接口定义了一个协议。通过使用该协议,一个Java 虚拟机的对象可以在其他Java 虚拟机对象上注册感兴趣的事件,并在事件发生时得到通知。接口中还规定了这类通知中必须包含的信息。协议中并未体现通知的可靠性与时限,这种保证并非协议的一部分,而是涉及到不同对象的一部分。
2.1涉及到的实体
事件和通知接口定义了实体的基本类型、对提交给实体的信息的需求,及一些支持性接口和类。
分布式系统中基本的对象有:对事件注册感兴趣的对象、发生事件的对象(事件产生者)和事件通知的接收者(远程事件监听者)。
事件产生者有某些其他对象可能会感兴趣的抽象状态,并允许其他对象对此事件注册兴趣。事件发生时,它将产生通知,发送通知到注册过此类事件的事件监听者。
基本类型由RemoteEventListener定义。远程事件监听者对其他对象发生的某类事件感兴趣。一个远程事件监听者的主要功能是接受其他对象中事件发生的通知。
支持性接口和类包括RemoteEvent对象、用作注册标识的EventRegistration对象,及一组可能产生的例外。远程事件是从事件产生者传递到远程事件监听者的对象,用来指示某类特殊事件的发生。EventRegistration类定义了返回注册者需要信息的对象,它是远程事件注册调用的返回值。EventRegistration类的实例包括一个事件类型的标识、当前事件类型的序列号,及一个注册的Lease对象。
保持与远程事件注册模型一致性的接口应反映:
·事件的注册是限定时间的,其方法是使那些注册在需要的时候续约。这可反映为返回一个注册的租约,把它作为事件注册的一部分。
·通知无需传送至最初注册兴趣的实体,即使用第三方过滤器。
·通知可以包含由原始注册者提供的MarshalledObject,使事件通知中能包含任意信息;注册调用应包括MarshalledObjecct以作为RemoteEvent的一部分来传送。
2.2 RemoteEventListener接口
RemoteEventListener是RemoteEvents的接收者。RemoteEventListener由一个只包含一个notify方法的接口来定义。方法将返回注册时导入的信息,允许登记者将任意信息或动作与通知信息关联起来。
RemoteEventListener接口应由希望从其他对象收到 RemoteEvent通知的对象所实现。为使事件发生的通知送至其他对象,注册调用需要接收一个目标参数来指明通知所应送达的对象。
RemoteEventListener接口继承自Remote接口及java.util.EventListener接口。前者说明RemoteEventListener中的方法为远程方法,支持这些方法的对象将通过RMI传递引用。后者用于Java AWT及JavaBeans组件中来指明某个接口是事件通知的接收者。RemoteEventListener接口由一个notify方法组成。
2.3 RemoteEvent类
RemoteEvent对象所包含的的基本形式包括:对发生事件的对象的引用、标识事件类型的长整型、一个指明发生的此类事件的序列号的long,和一个回复的Marshalled Object,它是注册者注册的一部分。这些RemoteEvent的通知对象作为RemoteEventListener对象notify方法的参数传递给 RemoteEventListener。
事件标识及从 RemoteEvent 对象得到的事件发生者引用的组合应唯一确定事件类型。如果此类型并非RemoteEventListener中注册兴趣(或其他代表RemoteEventListener注册)的类型,远程事件监听器的notify方法将抛出 UnknownEventException的例外。
从RemoteEvent对象获得的序列号是一个递增的值,以此来判定远程事件发生的先后顺序。
2.4 EventRegistration类
EventRegistration类的对象用于封装客户所需要的信息,标识出作为注册请求应答的通知,并维护此注册请求。一个允许事件注册的方法并不一定要返回一个EventRegistration类型的对象,但这个类的确包含了在事件模型中需要返回的信息类型。
关注此文的读者还看过: