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 ...
随机推荐
- php 如何写 mysql insert into 语句
$sql="INSERT INTO moneytb (riqi,item,inout,cost,bz) VALUES ('$riqi','$item','$inout','$cost','$ ...
- 深度学习应用系列(三)| autokeras使用入门
我们在构建自己的神经网络模型时,往往会基于预编译模型上进行迁移学习.但不同的训练数据.不同的场景下,各个模型表现不一,需要投入大量的精力进行调参,耗费相当多的时间才能得到自己满意的模型. 而谷歌近期推 ...
- Python开发基础-Day8-装饰器扩展和迭代器
wraps模块 让原函数保留原来的说明信息 import time import random from functools import wraps def auth(func): '''auth ...
- Xamarin Android真机测试报错
Xamarin Android真机测试报错 Xamarin Android真机测试报错,错误信息为INSTALL_CANCELLED_BY_USER.出现这个错误,通常都是真机上开发者选项设置错误 ...
- WebDAV服务漏洞利用工具DAVTest
WebDAV服务漏洞利用工具DAVTest WebDAV是基于Web服务的扩展服务.它允许用户像操作本地文件一样,操作服务器上的文件.借助该功能,用户很方便的在网络上存储自己的文件.为了方便用户使 ...
- NOIP2018训练题集
1. CZday3C 给定有m个数的集合,从其中任选一个子集满足全部&后不为零,问方案数. 考虑对二进制位容斥,问题转化为求包含某个二进制位集合的数的个数,通过类似FMT的DP求解. #inc ...
- [洛谷P3809]【模板】后缀排序
[洛谷P3809][模板]后缀排序 题目大意: 对于给定的长度为\(n(n\le10^6)\)的字符串求后缀数组\(sa[i]\). 思路: 倍增+快排构造后缀数组.代码参考<挑战程序设计竞赛& ...
- NOIP模拟·20141105题解
[A.韩信点兵] 结论题+模板题,用到了中国剩余定理,维基百科上讲的就比较详细,这里就不再赘述了…… 对于这题,我们先利用中国剩余定理($x \equiv \sum{(a_i m_i (m_i^{-1 ...
- React事件系统入门
React基于虚拟DOM实现了一个合成事件层,我们所定义的事件处理器会接受到一个合成事件层对象的实例,它完全符合W3C标准,不会存在任何IE标准的兼容性问题.并且和原生的浏览器事件一样拥有同样的接口, ...
- 浅谈js对象及对象属性
对象: ECMA-262把对象定义为 :无序属性的集合,其属性可以包含基本值,对象或者函数. 严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每一个属性或方法都有一个名字,而每个名字都映射到一 ...