JGroups之皮毛

前些天看了些关于JGroups方面的资料,怕时间久了将之忘于脑后,觉得有必要记录一下,这样日后就不用再从头看啦。
现在有很多项目都使用JGroups做底层的通讯,知道的开源项目有JBoss Cache和OSCache用它做为底层支持来实现集群的,一定还有其他的项目也用到了,只不过我不知道而已了。
JGroups是一个可靠的组间通讯工具,进程可以加入一个通讯组,给组内所有的成员或单独的成员发送消息,同样,也可以从组中的成员处接收消息。系统会记录组的每一个成员,在新成员加入或是现有的成员离开或是崩溃时,会通知组内的其他成员,这样我们就不必自己去管理这些事情了。
要想加入一个组,并与组内其他的成员交互,必须建立一个Channel连接到组,同一个组内的所有成员使用相同的组名称。首先是创建一个Channel,可以直接实例化一个Channel的实现,这里用的是JChannel:
[code]JChannel channel = new JChannel(props);[/code]
参数里指定Channel使用的协议栈,如果是空的,则使用默认的协议栈,位于JGroups包里的udp.xml。参数可以是一个以冒号分隔的字符串,或是一个XML文件,在XML文件里定义协议栈。
下面的是JGroups文档里给出的字符串的例子:
[code]String props="UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):" +
"PING(timeout=3000;num_initial_members=6):" +
"FD(timeout=5000):" +
"VERIFY_SUSPECT(timeout=1500):" +
"pbcast.STABLE(desired_avg_gossip=10000):" +
"pbcast.NAKACK(gc_lag=10;retransmit_timeout=3000):" +
"UNICAST(timeout=5000;min_wait_time=2000):" +
"FRAG:" +
"pbcast.GMS(initial_mbrs_timeout=4000;join_timeout=5000;" +
"join_retry_timeout=2000;shun=false;print_local_addr=false)";
JChannel channel;
try {
channel=new JChannel(props);
}
catch(Exception ex) {
// channel creation failed[/code]
创建完之后,Channel现在处于未连接状态,需要通过connect方法将之连接到组,使其处于连接状态:

[code]public void connect(String groupname) throws ChannelClosed;[/code]

它的参数就是要加入组的组名字,如果加入的组之前没有任何成员,则会自动创建一个组。
此时,Channel已处于连接状态,可以发送/接收消息了,发送消息的方法为:

[code]
public void send(Message msg) throws ChannelNotConnected, ChannelClosed;
public void send(Address dst, Address src, Object obj) throws ChannelNotConnected, ChannelClosed;
[/code]

两个方法基本是一样的,只不过一个是直接提供一个消息,而另一个只是提供了消息的目的地,源,和消息内容,其实这个方法在内部也是通过第一个方法来实现的,在其内部,将提供的这三个参数组合成一个消息,再调用第一个方法,具体使用哪个方法,则看个人喜好和实际情况了。
消息的由消息的目的地,源,Flag,消息内容,Header组成。其中如果目的地为空,则认为是发给所有组成员的消息;源为空的话,在底层的协议将其放到网络上时,会自动的将本Channel的地址填充进去。Address则是组成员的地址,用于唯一的标识一个组成员的接口,JGroups提供了几种默认的实现。下面的例子是发送一条消息到组内所有的成员处:

[code]
Hashtable data; // any serializable data
try {
channel.send(null, null, data);
}
catch(Exception ex) {
// handle errors
[/code]

再来一个发送到单独的组成员的例子:

[code]
Address receiver;
Hashtable data;
try {
receiver=channel.getView().getMembers().first();
channel.send(receiver, null, data);
}
catch(Exception ex) {
// handle errors
}
[/code]

其中的channel.getView().getMembers().first()是指从Channel中取出当前的成员列表,再从中取出第一个成员。之后就可以将这个成员做为目的地来发送消息了。
可以发送消息,同样也可以接收消息:

[code]
public Object receive(long timeout) throws ChannelNotConnected, ChannelClosed, Timeout;
[/code]

利用此方法可以取回多种消息,如普通的消息,View消息,等等。它的timeout参数则是指定超时的时间,如果设置为0时,而此时又没有新消息可以接收,此方法则会形成一个阻塞,在这一直等到有可用的消息为止;设置为大于0时,如果没有可用消息,超过此值后,会抛出一个Timeout异常。
下面的列表则是可以接收的消息的详细清单:
[code]
Message
View
SuspectEvent
BlockEvent
UnblockEvent
GetStateEvent
StreamingGetStateEvent
SetStateEvent
StreamingSetStateEvent
[/code]

同样,也给出一个此方法的应用小例子:

[code]
Object obj;
Message msg;
View v;
obj=channel.receive(0); // wait forever
if(obj instanceof Message)
msg=(Message)obj;
else if(obj instanceof View)
v=(View)obj;
else
; // don't handle suspicions or blocks
[/code]

receive()方法是Channel主动的去取消息,这种方式在现在的JGroups版本中已经不赞成被使用了,而替代方式则是通过setReceiver()方法向Channel注册一个监听器,在有消息到达的时候,自动的调用相应的方法来处理消息。
setReceiver()方法的参数是一个Receiver接口,此接口继承了MessageListener和MembershipListener,呵,看名字就知道这两个Listener是做什么的了。JGroups里提供了一个Receiver的Adapter:ReceiverAdapter,它只是为Receiver接口里的方法提供了一空的实现,可以让我们在自己的实现中只需实现关心的方法就OK了。下面是一个用注册Receiver的形式接收消息的实例:

[code]
JChannel ch=new JChannel();
ch.setReceiver(new ReceiverAdapter() {
public void receive(Message msg) {
System.out.println("received message " + msg);
}
public void viewAccepted(View new_view) {
System.out.println("received view " + new_view);
}
});
ch.connect("bla");
[/code]

利用上面的的两种方式接收消息时,会将接收到的消息从消息队列中删除,如果只是想了解一下下一条消息,而又不想将它从消息队列中删除时,可以使用peek()方法,它的使用方式同receive()。
了解了如果发送和接收消息之后,现在Channel想转移到未连接状态啦,可以使用disconnect(),将Channel与组断开连接,这个时候如果再执行发送或接收消息的操作的话,那就等着接收异常吧,呵。
Channel处于未连接状态之后,可以重新连接到组,也可以通过close()方法关闭Channel,需要注意的是,执行了close()之后,就不能直接执行connect()方法来使Channel连接到组了,需要使用open()来将Channel重新打开,之后再能与组进行连接。

上面只是对JGroups的简单应用做一下整理,其实这只是JGroups的皮毛而已,JGroups还包含很多内容:状态传递,Building Blocks(OSCache使用的就是Building Blocks里的NotificationBus),还有协议栈等等好多内容,这些还得慢慢的继续学习啊。

相关推荐

多模态脑区细分图谱 HCP-MMP v1.0, Glasser et al. 2016 皮层和皮下区域,简写和全称对应关系

人类连接组计划多模态脑区细分图谱(HCP-MMP)提供了对人类大脑皮层区域的非常有用的细分(Glasser et al. 2016a, b)。图谱是多模态的,因为每个区域都是根据四个标准的组合定义的,包括结构(T1加权/T2加权髓鞘含量和皮层厚度图)、静息态功能连接、基于任务的激活和拓扑地形组织。HCP-MMP v1.0图谱包含每个半球180个皮层区域,基于210名参与者的分析。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2509

JGroups介绍及入门实战

但是,消息队列在使用的时候会显得太“重”,他需要额外启动的队列进程:存储队列消息,特定的进程间通信接口。我们在实际工作中,集群往往是按需搭建的,因此缺乏统一、有效的集群模型,其中有技术上实现难度的原因,也有思维上缺乏构建模型的原因,但是jgroups让我们发现,集群的管理功能,如状态同步、消息传递、底层通信都可以模块化设计的。可以看到,为了实现组播,其实底层是需要有很多网络维护工作的,特别是集群中节点故障状态的控制,由于jgroups帮我们做了,所以我们才可以这么简单的完成可靠性如此之高的组播功能。

a1058926697的博客 4121

工业机器人进出口数据(2012.1-2025.10).xlsx

详细介绍及样例数据:https://blog.csdn.net/T0620514/article/details/156048325

JGroup全面深入学习--常规使用【1】

JGroups集群通信工具,本文展示了如何创建通道、加入和离开集群、发送和接收消息、获得视图更改通知以及实现状态传输,以及JGroups的JChannel和Receiver api提供的核心功能。

joiwsev的博客 2290

JGroups 简介、适用场合、配置、程序例子Demo等完全使用指南

2007-05-08 14:38 目前项目中在克服JGroups初期使用的困难之后,已经使用比较稳定了。感觉比较烦琐和容易出错的还是JGroups配置。感觉中文的资源较少,现将自己总结的经验总结如下Tim http://hi.baidu.com/jabber/blog/item/7e879852a23efd0f0cf3e3ea.htmlJGroups 适合使用场合服务器集群clu...

“因举报被劝退”学生:我愿做出头鸟 790

分布式通信框架 - JGroups

分布式通信框架 - JGroups

weixin_46619605的博客 883

推荐文章:JGroups - 高效可靠的分布式通信框架

推荐文章:JGroups - 高效可靠的分布式通信框架 JGroupsThe JGroups project项目地址:https://gitcode.com/gh_mirrors/jg/JGroups JGroups 是一个用于构建高可用、可靠和高效的分布式系统的开源通信框架。它提供了一套完整的解决方案,可以实现节点间的发现、组播和单播消息传递、故障检测和容错等功能。 JGroups 能用来做什...

gitblog_00004的博客 660

组通信之jgroups篇----jgroups综述

 Group communication uses the terms group and member. Members are part of a group. In the more common terminology,a member is a node and a groups is a cluster. We use these words interchangeably.我

ustcgy的专栏 3415

【分布式通知技术-JGroups

    什么是JGroups JGroups是一个可靠的组播通讯工具集(需要说明的是,这并不是说必须要使用IP Multicast,JGroups也可以使用TCP来实现)。JGroups可以用来创建一个组,这个组中的成员可以给其他成员发送消息。   JGroups is a toolkit for reliable messaging. It can be used to create...

468

基于Java的实例源码-多播通讯框架 JGroups

通过JGroups,您可以创建和管理群组,实现节点之间的可靠通信,并能自动处理成员的加入和退出。4. **可靠的消息传递**:JGroups提供了可靠的消息传递机制,确保消息的可靠发送和接收,并能处理网络中的丢包和延迟问题。5. **成员管理**:JGroups可以自动检测和管理群组中的成员,实现动态的成员加入和退出,并提供成员加入和退出的通知。1. **群组通信**:JGroups允许创建和管理一个或多个群组,让系统中的节点能够通过群组通信来实现互相交流和协作。## JGroups的特性。

m0_62396648的博客 371

JGroups学习(二)

一. JGroups协议栈简介 JGroups最强大的功能在于它灵活的协议栈配置,允许开发者调整协议栈中的协议从而适应自己实践的环境和需求。 JGroups启动时会根据配置的协议栈,构成一个协议栈Java对象,发送的消息会自顶向下的依次经过各层协议进行处理,直至发送到网络链路层。同样,收到的消息,JGroups也会将消息自底向上的传递,直至回调ReceiverAdapter交由应用程序。 消

xianymo的专栏 1865

JGroups

JGroups 1 Overview    JGroups是一个用于建立可靠的组播通信的工具包(这里指的组播并不一定是IP Multicast,JGroups同样支持使用TCP作为传输协议)。其中可靠性是指通过适当的配置可以保证:消息在传输的过程中不会丢失;所有的接收者以相同的顺序接受所有的消息;原子性:一个消息要么被所有的接收者接收,要么不被任何一个接收者都接收。目前在JBoss...

风——Anthony 494

JGroups简介和例子

JGroups是一个组播通信工具,它可以: [list] [*]创建和删除一个组 [*]加入和离开某个组 [*]管理组成员关系,当有新的成员进入或存在的成员离开的时候会通知组内其它成员 [*]侦测和移除出现故障的组成员 [*]发送单播消息(unicast,point-to-point) [*]发送广播消息(multicast,point-to-multipoint) [/li...

iteye_19622的博客 468

jgroups传输消息_使用JGroups进行ElasticMQ消息复制

jgroups传输消息 ElasticMQ是一个消息服务器,具有Scala,Java和与Amazon SQS兼容的接口。 它通过跨服务器群集复制消息来支持有保证的消息传递,并通过日志记录实现消息持久性。 消息复制是ElasticMQ的核心功能之一。 但是,如果您看一下代码,则只有少数几个类,最长的类有76行(请记住,这是Scala,虽然;))。 这是因为ElasticMQ使用JGrou...

最佳 Java 编程 367

分布式通知技术-JGroups 入门

1 基本信息 摘要:介绍什么是Multicast,什么是JGroups,以及JGroups详解 作者:翁阳 2 什么是Multicast   Multicast是一种同时像多台机器发送数据的机制。Multi

4067

利用JGroup同步Memcache文件

利用JGroup同步Memcache文件

走向资深架构师的旅程 5090

hok_env自定义英雄AI开发:如何创建你的专属王者荣耀英雄AI

想要打造属于自己的王者荣耀AI英雄吗?hok_env王者荣耀AI开放环境为你提供了完整的解决方案!作为腾讯官方推出的强化学习开发平台,hok_env让开发者能够轻松创建和训练自定义英雄AI,在1v1和3v3对战中展现智能策略。本文将为你详细介绍如何使用hok_env开发专属英雄AI的完整流程。🚀 ## 🔥 什么是hok_env王者荣耀AI开放环境? hok_env是腾讯天美工作室推出的王者

gitblog_00966的博客 365

JGroups系列之介绍和体会

JGroups系列之介绍和体会                很早就想做这个JGroups系列,因为在分布式的系统中,各个部分经常需要相互通信。这些通信包括:信息需要同时发给集群中的某些或全部的worker;或者一个worker启动、停止需要通知其他的worker;等等。          对于这些问题的解决,我们通常有各种各样的方法。比如,信息需要同时发给集群中的某些或全部的worke

软件的信雅达 1万+

组通信之jgroups篇----JChannel

 In order to join a group and send messages, a process has to create a channel. A channel is like a socket. When a client connects to a channel, it gives the the name of the group it would like to

ustcgy的专栏 6936

xml基础、DTD验证、Schema验证(备忘)

一、xml基础详解: 1、概述:     xml:即可扩展标记语言,xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。xml是当前处理结构化文档信息中相当给力的技术,xml有助于在服务器之间穿梭结构化数据,这使得开发人员更加得心应手的控制数据的存储和传输。 Xml用于标记电子文件使其具有结构性的标记

槿墨色 9051
上一篇: FCKeditor--入门.
下一篇: 走进Groovy世界--来到大门前
Puras
博客等级 码龄21年 2粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值