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下。接下来我们依次启动三个节点:
./ rspFilter.sh -n node1
./ rspFilter.sh -n node2
./ rspFilter.sh -n node3
注意,-n指定一个节点名字,Windows操作系统使用对应.bat脚本。
结果分析
1. node1,node2 和node3中任何一个节点启动后我们都可以看到调运群组成员getNodeName()方法的日志信息,如下为node1上输出的日志:
09:48:07,614 INFO [RspFilterTest] Call all members getNodeName()
2. node1,node2 和node3中任何一个节点启动调运群组成员getNodeName()方法,可以看到远程方法的返回输出信息,如下为node3上打印输出远程方法的返回:
Responses:
node1
node3
如上,node2节点的名字没有被返回,是因为RspFilter定义的响应规则是将node2不加入响应返回列表。
3. node1,node2 和node3中任何一个节点运行的日志中我们可以看到MyMembershipListener输出的日志,当群组成员关系发生变化是群视图被打印输出,如下为node1上输出的日志信息:
09:48:35,928 INFO [MyMembershipListener] ViewAccepted, [node1|2] [node1, node2, node3]
[node1|2][node1, node2, node3]为打印输出的群组视图,node1|2 表示群组的协调者为node1且视图被更新了3次(node1,node2,node3依次加入集群)。
代码分析
本示例所有的源代码可以在cluster/jgroups/stu/src/main/java/.../blocks下找到,接下来我们从代码的层面去解释上面的分析结果,这样有助于更直观的理解构建块RspFilter接口的理解。
30 channel = new JChannel();
31 if(null != name) {
32 channel.setName(name);
33 }
35 messageListener = new MyMessageListener();
36 membershipListener = new MyMembershipListener();
37 rpcMethods = new RpcMethods(channel);
38 disp = new RpcDispatcher(channel, messageListener, membershipListener, rpcMethods);
39 channel.connect("RspFilterTestGroup");
如上30-33行初始化一个jGroups通道,并设定通道的名称;35-38行分别初始化MyMessageListener,MyMembershipListener,RpcMethods,接着初始化RpcDispatcher;39行通道连接到集群(RspFilterTestGroup),通道只有在连接状态才可以相互发送接收消息。
42 String param = channel.getName();
43 MethodCall call = new MethodCall("getNodeName", new Object[]{param}, new Class[]{String.class});
44 logger.info("Call all members getNodeName()");
45 RequestOptions requestOptions = new RequestOptions(ResponseMode.GET_ALL, 0, false, new MyRspFilter());
如上代码段通过RpcDispatcher的 callRemoteMethods()方法调运集群中的方法,MethodCall实例指定远程方法名为getNodeName,传递的参数为当前节点的名字,ResponseMode.GET_ALL表示我们使用GET_ALL模式,即等待所以节点方法返回,MyRspFilter为RspFilter接口的实现,callRemoteMethods中参数为null,表明所有节点上的方法被调运;
48 System.out.println("Responses:");
49 List<String> list = rsp_list.getResults();
50 for(Object obj : list) {
51 System.out.println(" " + obj);
52 }
如上代码段依次打印输出getNodeName()方法的返回结果。
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时,群组通信忽略此消息。
JBoss 系列十九:使用JGroups构建块RspFilter对群组通信返回消息进行过滤的更多相关文章
- JBoss 系列十七:使用JGroups构建块MessageDispatcher 构建群组通信应用
内容概要 本部分说明JGroups构建块接口MessageDispatcher,具体提供一个简单示例来说明如何使用JGroups构建块MessageDispatcher 构建群组通信应用 示例描述 构 ...
- JBoss 系列十八:使用JGroups构建块RpcDispatcher构建群组通信应用
内容概要 本部分说明JGroups构建块接口RpcDispatcher,具体提供一个简单示例来说明如何使用JGroups构建块RpcDispatcher构建群组通信应用. 示例描述 类似Message ...
- Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十九】
<Web 前端开发精华文章推荐>2013年第七期(总第十九期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- Katalon系列十九:元素相同或无法定位时的定位技巧
经常看到有人问元素属性都相同,怎么定位,这里总结一下.下面以Xpath为例讲解,CSS其实也是一样的,只是语法不一样罢了.网上说CSS会比Xpath快一些,但在Katalon主用Xpath,感觉也还行 ...
- JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件
http://www.tuicool.com/articles/M7ZR3y 原文 http://blog.csdn.net/kylinsoong/article/details/12623997 主 ...
- SSE图像算法优化系列十九:一种局部Gamma校正对比度增强算法及其SSE优化。
这是一篇2010年比较古老的文章了,是在QQ群里一位群友提到的,无聊下载看了下,其实也没有啥高深的理论,抽空实现了下,虽然不高大上,还是花了点时间和心思优化了代码,既然这样,就顺便分享下优化的思路和经 ...
- ES系列十九、kibana基本查询、可视化、仪表盘用法
一. 定义索引模式匹配 1.前缀模糊匹配,一个模式匹配多个索引 每一个数据集导入到Elasticsearch后会有一个索引匹配模式,在上段内容莎士比亚数据集有一个索引名称为shakespeare,账户 ...
- WPF入门教程系列十九——ListView示例(一)
经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能.从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Windo ...
随机推荐
- 堆管理之malloc和free分析
在win7 64环境下分析 1.malloc代码 int main(){ void *p = malloc(0xa8); memset(p, 'a', 0xa8); free(p); return 0 ...
- nigin配置安全:三个案例看Nginx配置安全(转)
转:https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html 三个案例看Nginx配置安全 PHITHON 之 ...
- CF1027C Minimum Value Rectangle【贪心/公式化简】
https://www.luogu.org/problemnew/show/CF1027C #include<cstdio> #include<string> #include ...
- CodeForces 733C Epidemic in Monstropolis
模拟. 连续的一段$a$合成一个$b$.每段中如果数字只有$1$个,那么可以合成.如果数字个数大于等于$2$个,如果都是一样的,那么无法合成,否则要找到一个可以移动的最大值位置开始移动.一开始写了一个 ...
- java.lang.ClassCastException: xut.bookshop.entity.User_$$_javassist_3 cannot be cast to javassist.util.proxy.Proxy
报错信息 java.lang.ClassCastException: xut.bookshop.entity.User_$$_javassist_3 cannot be cast to javassi ...
- Spring源码分析之Bean的加载流程
spring版本为4.3.6.RELEASE 不管是xml方式配置bean还是基于注解的形式,最终都会调用AbstractApplicationContext的refresh方法: @Override ...
- Trie树【UVA11362】Phone List
Description 给定\(n\)个长度不超过\(10\)的数字串,判断是否有两个字符串\(A\)和\(B\),满足\(A\)是\(B\)的前缀,若有,输出NO,若没有,输出YES. 一道\(Tr ...
- [BZOJ1444]有趣的游戏(AC自动机+矩阵乘法)
n个等长字符串,机器会随机输出一个字符串(每个字母出现的概率为p[i]),问每个字符串第一个出现的概率是多少. 显然建出AC自动机,套路地f[i][j]表示i时刻位于节点j的概率. 构建转移矩阵,当i ...
- JZYZOJ 1542 [haoi2015]str 矩阵乘法 dp
http://172.20.6.3/Problem_Show.asp?id=1542 dp+矩阵乘法思路hin好想,对于我这种题目稍微学术就几乎什么也不会的人来说唯一的难点在于读题,因为一心想着划水题 ...
- BZOJ 3127 [Usaco2013 Open]Yin and Yang(树点分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3127 [题目大意] 给出一棵01边权树,求存在多少条路径,使得路径上0和1的数量相同, ...