JGroups(3)
转载自:http://whitesock.iteye.com/blog/199595
?
3 Building Blocks
??? Building blocks位于org.jgroups.blocks包中,在逻辑上可以视为channels之上的一层,它提供了更复杂的接口。Building blocks并不必依赖于channels,部分building blocks只需要实现了Transport接口的类即可工作。以下简要介绍部分building blocks。
3.1 MessageDispatcher
??? Channels 通常用于异步地发送和接收消息。然后有些情况下需要同步通信,例如发送者希望向集群发送消息并等待所有成员的应答,或者等待部分成员的应答。MessageDispatcher支持以同步或者异步的方式发送消息,它在构造时需要一个Channel型的参数。
??? MessageDispatcher提供了Object handle(Message msg)方法,用于以push 方式的接收消息并返回应答(必须可以被序列化),该方法抛出的异常也会被传播到消息发送者。MessageDispatcher在内部使用了PullPushAdapter,PullPushAdapter也是org.jgroups.blocks包中的类,但是已经被标记为deprecated。这种方式被称为MessageDispatcher的server模式。
??? MessageDispatcher的client模式是指通过调用castMessage或者sendMessage向集群发送消息并同步或者异步的等待应答。castMessage()方法向dests指定的地址发送消息,如果dest为null,那么向集群中所有成员发送消息。castMessage()方法的返回值是RspList,RspList 实现了Map<Address,Rsp> 接口。msg参数中的目的地址会被覆盖。mode参数(由org.jgroups.blocks.GroupRequest类定义)指定了消息是同步还是异步发送,其可选值如下:
- GET_FIRST 返回收到的第一个应答。
- GET_ALL 等待所有成员的应答(被怀疑崩溃的成员除外)。
- GET_MAJORITY 等待绝大多数成员(相对与成员的个数)的应答。
- GET_ABS_MAJORITY等待绝大多数成员(一个绝对的数值,只计算一次)的应答。
- GET_N 等待n个应答,如果n大于成员的个数,可能会一直阻塞下去。
- GET_NONE 不等待应答,直接返回,即异步方式。
??? castMessage()方法的定义如下:
catch?(Exception?e)?{?? - ????????????e.printStackTrace();??
- ????????}??
- ????}??
- } ?