JBoss 系列十九:使用JGroups构建块RspFilter对群组通信返回消息进行过滤
内容概述
本部分说明JGroups构建块接口RspFilter,具体提供一个简单示例来说明如何使用JGroups构建块RspFilter对群组通信返回消息进行过滤。
我们知道构建块基于通道之上,是对通道API的更高层抽象,而RspFilter是构建块的主要接口,它可以更灵活的自定义群组调运的模式,对响应响应消息进行过滤。具体RspFilter可以确定是否将群组中所有的节点添加到返回列表,或确定当接收到某一特定成员的响应消息后,群组调运者是否终止调运。如示例-3RpcDispatcher通信模式中我们通过RequestOptions定义返回模式(GET_FIRST,GET_ALL,GET_MAJORITY,GET_NONE),但RspFilter对响应返回的过滤优先于RequestOptions定义的返回模式。
本示例基于示例-3RpcDispatcher通信模式示例,在示例-3的基础上添加RspFilter响应返回过滤,测试GET_ALL响应模式与RspFilter定义的过滤规则之间的优先级,以及通过示例体会RspFilter使群组通信更灵活,更可自定义。
示例步骤本示例集群中有三个成员node1,node2 和node3,node1 为协调者(第一个加入集群)负责集群视图的更新。RpcMethods类定义了getNodeName()方法,三个节点启动后都调运集群中所有节点上RpcMethods类的getNodeName()方法,并等待该方法的返回。RspFilter定义的响应规则是将node2不加入响应返回列表(节点上的方法被调运时,忽略getNodeName()方法的返回)。使用JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME,本示例的启动脚本rspFilter.sh位于DEMO_HOME/bin下。接下来我们依次启动三个节点:
6 public class MyRspFilter implements RspFilter { 7 8 public boolean isAcceptable(Object response, Address sender) { 9 String name = (String) response; 10 if(name.equals("node2")) { 11 return false; 12 }else { 13 return true; 14 } 15 }
第6行MyRspFilter实现了RspFilter接口,8-14行isAcceptable()方法为返回消息的过滤规则,即当getNodeName()得到的节点名字为node2时,群组通信忽略此消息。