内容概要

本部分说明JGroups构建块接口MessageDispatcher,具体提供一个简单示例来说明如何使用JGroups构建块MessageDispatcher 构建群组通信应用

示例描述

构建块基于通道之上,是对通道API的更高层抽象,MessageDispatcher提供异步和同步的方法发送消息给集群中的成员并等待响应,我们知道直接使用jGroups API可以向群组发送消息,或从群组接收消息,但发送和接收之间没有任何联系,而使用MessageDispatcher发送消息和接收消息是在同一个事务中完成。本示例演示使用MessageDispatcher 发送消息到集群所有成员并等待响应,验证 GET_ALL 响应模式,超时时间等属性。

示例步骤

本示例集群中有三个成员node1,node2 和node3,node1 为协调者(第一个加入集群)负责集群视图的更新。三个节点都是做相同的事情,向集群中所有节点发送一条消息,并等待接收响应消息。使用JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME,本示例的启动脚本msgDispatcher.sh位于DEMO_HOME/bin下。接下来我们依次启动三个节点:

./msgDispatcher.sh -n node1
./msgDispatcher.sh -n node2
./msgDispatcher.sh -n node3

注意,-n指定一个节点名字,Windows操作系统使用对应.bat脚本。

结果分析

1. node1,node2 和node3中任何一个节点启动后我们都可以看到发送消息到群组的日志信息,如下为node1上输出的日志:

16:36:43,699 INFO  [MessageDispatcherTest] Casting message to all group members

2. node1,node2 和node3中任何一个节点启动发送完消息后都可以看到群组中返回消息的输出信息,如下为node3上打印输出的响应消息:

Responses:node3-MessageDispatcher Test Messagenode2-MessageDispatcher Test Messagenode1-MessageDispatcher Test Message

我们可以看到node3节点打印输出的响应消息有三条,及集群中的所有节点都收到node3发送的消息,且集群中所有节点发送的响应消息都被node3收到。我们可以通过响应模式来控制是否消息发送者要等待所有节点的响应消息,本示例中使用的是 GET_ALL 响应模式,所以只有当接收到所有节点的响应消息或等待超时抛出异常才终止。

3. node1,node2 和node3中任何一个节点启动后的日志中我们可以看到MyRequestHandler处理消息输出的日志,如下为node1上输出的日志:

16:37:11,839 INFO  [MyRequestHandler] node3, MessageDispatcher Test Message

4. node1,node2 和node3中任何一个节点运行的日志中我们可以看到MyMembershipListener输出的日志,当群组成员关系发生变化是群视图被打印输出,如下为node1上输出的日志信息:

16:37:11,655 INFO  [MyMembershipListener] ViewAccepted, [node1|2] [node1, node2, node3]

[node1|2] [node1, node2, node3]为打印输出的群组视图,node1|2 表示群组的协调者为node1,竖线后面的2表示视图被更新了3次(node1|0,node1|1,node1|2);视图中共有三个成员,即node1,node2 和node3。

代码分析

本示例所有的源代码可以在cluster/jgroups/stu/src/main/java/.../blocks下找到,接下来我们从代码的层面去解释上面的分析结果,这样有助于更直观的理解构建块MessageDispatcher的理解:

47                 channel = new JChannel(props);48                 if(null != name) {49                         channel.setName(name);50                 }51                 handler = new MyRequestHandler(channel);52                 messageListener = new MyMessageListener();53                 membershipListener = new MyMembershipListener();
55                 disp = new MessageDispatcher(channel, messageListener, membershipListener, handler);56                 channel.connect("MessageDispatcherTestGroup");
58                 Util.sleep(100);59                 logger.info("Casting message to all group members");60                 Message message = new Message(null, null, new String("MessageDispatcher Test Message"));61                 rsp_list = disp.castMessage(null, message, new RequestOptions().setMode(ResponseMode.GET_ALL).setTimeout(0));
63                 System.out.println("Responses:");
65                 List list = rsp_list.getResults();66                 for(Object obj : list) {67                         System.out.println("  " + obj);68                 }

如上47-50行创建一个,设定相应节点的名字;55行实例化一个 MessageDispatcher,我们可以看到,构建块接口是基于通道之上,是对通道的更高层抽象,所以创建 MessageDispatcher时需要传递一个实例化的通道(channel),MessageDispatcher 实例化后通道开始连接到群组(如56行所示);59-61行创建一个消息,通过 castMessage()方法将消息发送到群组,注意,目的地址为空,所以消息接收者为群组所有成员,响应模式为 GET_ALL,所以发送者等待所有成员响应后 castMessage()方法返回,超时时间为 0,即castMessage一直出于等待状态知道所有节点响应消息返回或超时抛出异常;65-68行打印输出所有响应返回消息。

9 public class MyRequestHandler implements RequestHandler {...20         public Object handle(Message msg) throws Exception {21                 Address sender = msg.getSrc();22                 logger.info(sender + ", " + msg.getObject());23                 return channel.getName() + "-" + msg.getObject();24         }25 26 }

如上第9行,MyRequestHandler实现RequestHandler接口,RequestHandler定义了handle方法,用来处理接收到的消息,20-24行为我们实现的handle方法,我们在日志中记录消息发送者的名字和消息的内容(结果分析第3点node1输出的日志“node3, MessageDispatcher Test Message”表示消息发送着是node3,消息的内容是“MessageDispatcher Test Message”),并将自己的名字和接收到消息的内容返回(结果分析第2点node3输出的日志包括“node1-MessageDispatcher Test Message”表示该响应消息是从node1返回的)。

8 public class MyMembershipListener implements MembershipListener {...12         public void viewAccepted(View view) {13                 logger.info("ViewAccepted, " + view);14         }

如上第8行表示MyMembershipListener实现了MembershipListener接口,MembershipListener接口定义一些成员控制的方法,这里我们实现了viewAccepted()方法,即当群组成员发生变化时该方法被调运,记录群组视图到日志中。

JBoss 系列十七:使用JGroups构建块MessageDispatcher 构建群组通信应用相关推荐

  1. Dapr微服务应用开发系列5:发布订阅构建块

    题记:这篇介绍发布订阅构建块,这是对事件驱动架构设计的一种实现落地. 注:对于"Building Blocks"这个词组的翻译,我之前使用了"构件块",现在和官 ...

  2. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十七】

    <Web 前端开发精华文章推荐>2013年第五期(总第十七期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  3. Dell™ PowerEdge™ R710机架式服务器旨在成为虚拟化企业的构建块

    Dell™ PowerEdge™ R710机架式服务器旨在成为虚拟化企业的构建块.它根据IT专业人员提供的反馈设计制造,是新一代2U机架式服务器,旨在有效地满足任何虚拟化业务应用程序的需求.Power ...

  4. 用可组合的构建块丰富用户界面?谷歌提出「可解释性」的最新诠释

    本文转自雷克世界(ID:raicworld) 编译 | 嗯~阿童木呀 随着在神经网络领域不断取得新的发展成果,有一个相对应的需求也亟待解决,即能够对其决策进行解释,包括建立它们在现实世界中行为方式的置 ...

  5. Gradle构建脚本概要之构建块

    为什么80%的码农都做不了架构师?>>>    每个Gradle构建都包含三个基本构建块:project,task和property.每个构建至少一个project,进而又包含一个或 ...

  6. JBoss 系列五十:使用Apache httpd(mod_jk)和JBoss构架高可用集群环境

    2019独角兽企业重金招聘Python工程师标准>>> 概述 前面JBoss 系列二:使用Apache httpd(mod_cluster)和JBoss构架高可用集群环境中我们介绍了 ...

  7. 面向.NET开发人员的Dapr- actors 构建块

    原文地址:https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/actors The actor m ...

  8. 自然语言处理系列十七》中文分词》分词工具实战》Python的Jieba分词

    注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书<分布式机器学习实战>(人工智能科学与技术丛书)[陈敬雷编著][清华大学出版社] 文章目录 自然语言处理系列十七 分词工 ...

  9. Reflex WMS入门系列十七:修改IPG的Grade

    Reflex WMS入门系列十七:修改IPG的Grade Reflex WMS系统里有2个与库存有关的概念,一个是HD,一个是IPG.HD可以简单的理解为托盘,IPG可以理解为放在托盘的物料的库存. ...

最新文章

  1. 借助深度卷积神经网络对图片 GIF 视频进行超分辨率放大(即放大与降噪) 以及 对视频进行 插帧(即补帧).
  2. BZOJ 1226: [SDOI2009]学校食堂Dining [DP 状压]
  3. python3.6.8卸载_Mac 卸载 彻底删除 自己下载的 python 3
  4. php封装数据库操作类,php简单数据库操作类的封装
  5. logistics and sigmoid
  6. Natasha 4.0 探索之路系列(四) 模板 API
  7. MySQL 集群方案介绍
  8. 超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!
  9. 为什么CPU的使用率总是100%
  10. idea中maven下载依赖包出错
  11. phpstudy使用mysql8.0_windows系统-phpstudy升级mysql8.0.12安装教程及修改密码和安装注意事项...
  12. Pycharm汉化包+操作步骤
  13. Windows 8 关闭无线后无法打开WIFI的解决办法
  14. FPGA学习篇之计数器
  15. iexplore.exe_如何一次杀死所有iexplore.exe进程?
  16. ATTCK实战系列——红队实战(二)
  17. 微信开挂怎么防止封号_为什么我的微信老是被封解决办法 微信如何防止被封号详细介绍...
  18. [超光速与空间]超光速与预测
  19. ios 打印 详细错误日志_iOS中打印系统详细日志
  20. 湖南计算机考试模拟程序,湖南省计算机等级考试模拟 试卷5

热门文章

  1. Android RotateAnimation详解
  2. android toolchain maintain team
  3. BottomNavigationView处理只有2个tab的情况
  4. Java集合—ArrayList底层原理
  5. 如何实现不安装xpoedinstall激活xposed模块
  6. 21.Longest Palindromic Substring(最长回文子串)
  7. jmeter控制器--if控制器
  8. C#中静态方法和非静态方法的区别
  9. jQuery选择器引擎和Sizzle介绍
  10. 数独求解 DFS DLX