`
Puras
  • 浏览: 108414 次
  • 性别: Icon_minigender_1
  • 来自: 哪
社区版块
存档分类
最新评论

JGroups之皮毛

    博客分类:
  • Java
阅读更多
    前些天看了些关于JGroups方面的资料,怕时间久了将之忘于脑后,觉得有必要记录一下,这样日后就不用再从头看啦。
    现在有很多项目都使用JGroups做底层的通讯,知道的开源项目有JBoss Cache和OSCache用它做为底层支持来实现集群的,一定还有其他的项目也用到了,只不过我不知道而已了。
    JGroups是一个可靠的组间通讯工具,进程可以加入一个通讯组,给组内所有的成员或单独的成员发送消息,同样,也可以从组中的成员处接收消息。系统会记录组的每一个成员,在新成员加入或是现有的成员离开或是崩溃时,会通知组内的其他成员,这样我们就不必自己去管理这些事情了。
    要想加入一个组,并与组内其他的成员交互,必须建立一个Channel连接到组,同一个组内的所有成员使用相同的组名称。首先是创建一个Channel,可以直接实例化一个Channel的实现,这里用的是JChannel:
JChannel channel = new JChannel(props);

参数里指定Channel使用的协议栈,如果是空的,则使用默认的协议栈,位于JGroups包里的udp.xml。参数可以是一个以冒号分隔的字符串,或是一个XML文件,在XML文件里定义协议栈。
下面的是JGroups文档里给出的字符串的例子:
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

    创建完之后,Channel现在处于未连接状态,需要通过connect方法将之连接到组,使其处于连接状态:

public void connect(String groupname) throws ChannelClosed;


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

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


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

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


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

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


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

public Object receive(long timeout) throws ChannelNotConnected, ChannelClosed, Timeout;


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


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

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


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

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");


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

    上面只是对JGroups的简单应用做一下整理,其实这只是JGroups的皮毛而已,JGroups还包含很多内容:状态传递,Building Blocks(OSCache使用的就是Building Blocks里的NotificationBus),还有协议栈等等好多内容,这些还得慢慢的继续学习啊。
分享到:
评论
7 楼 Puras 2007-05-25  
没有遇到过这种情况

能详细说说嘛
6 楼 galaxystar 2007-05-22  
jgroups有bug!
组播时,会自己卡住。似乎像死循环!
5 楼 Puras 2007-05-22  
Building blocks的目的是将程序员从编写乏味和重复代码中解脱出来
PS:文档上这样写的,呵。
4 楼 shaucle 2007-05-22  
Blocks主要是对JChannel的包装

协议栈好多...
3 楼 Puras 2007-05-22  
xiaoyu 写道
为什么不顺便把做一个附件呢. 呵

在记事本里写的
直接paste进来的
2 楼 xiaoyu 2007-05-22  
为什么不顺便把做一个附件呢. 呵
1 楼 Puras 2007-05-22  
为什么在预览的时候,有些代码块会出现重复的情况???

相关推荐

    JavaEE源代码 jgroups-2.2.8

    JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 jgroups-2.2.8JavaEE源代码 ...

    jgroups-2.2.7.jar

    jgroups-2.2.7.jar jgroups-2.2.7.jar

    JGroups的Raft实现jgroups-raft.zip

    jgroups-raft 项目是 JGroups 框架对 Raft 的实现。Maven:<groupId>org.jgroups <artifactId>jgroups-raft <version>0.2</version>Raft 是一个容易理解的共识算法。在容错和性能方面它相当于 Paxos(Google 的一致...

    jgroups.part1

    jgroups.part1

    JGroups_集群.pdf

    JGroups_集群.pdf

    jgroups-3.0.2

    JGroups是一个开源的纯java编写的可靠的群组通讯工具。其是一个可靠的组播通讯工具集(需要说明的是,这并不是说必须要使用IP Multicast,JGroups也可以使用TCP来实现)。其工作模式基于IP多播,但可以在可靠性和群组...

    jgroups-3.2

    JGroups是一个开源的纯java编写的可靠的群组通讯工具。其是一个可靠的组播通讯工具集(需要说明的是,这并不是说必须要使用IP Multicast,JGroups也可以使用TCP来实现)。其工作模式基于IP多播,但可以在可靠性和群组...

    jgroups.part3

    jgroups.part3

    Ehcache通过Jgroups做集群

    Ehcache通过使用Jgroups做集群配置,更改每一个不同的jgroups.xml文件的端口号和IP,如果一台机器就使用127.0.0.1即可。配置好之后,把每台机器起来,就可以测试了。

    jgroups源代码

    jgroups源代码,想要学习jgroups开源框架的童鞋可以看看

    Jgroups 教程

    JGROUPs 的重要用法全部都在里面了

    Android代码-jgroups-android

    JGroups - A Framework for Group Communication in Java ======================================================== March 3, 1998 Bela Ban 4114 Upson Hall Cornell University Ithaca, NY 14853 bba@...

    Jgroups中的UNICAST3协议中文翻译

    Jgroups是一款组播工具,基于IP多播的可靠的组播中间件

    jgroups-2.6.8.GA.jar

    jgroups-2.6.8.GA.jar jgroups-2.6.8.GA.jar

    基于JGroups的共享电子白板系统的研究与实现

    基于JGroups的共享电子白板系统的研究与实现

    Java多播通讯框架 JGroups

    Java多播通讯框架 JGroups

    JGroups(Java多播通讯框架) v4.0.0.CR1.zip

    JGroups(Java多播通讯框架)简介 JGroups是一个可靠的群组通讯Java工具包。它基于IP组播(IP multicast),但在可靠性,组成员管理上对它作了扩展。 JGroups的可靠性体现在: 1,对所有接收者的消息的无丢失传输...

    jgroups的jar

    JGroups是一个开源的纯java编写的可靠的群组通讯工具。其是一个可靠的组播通讯工具集

    Jgroups-all.jar

    JGroup是当前被广泛使用的可靠组间通信的工具之一。例如OSCache以及JBossTreeCache都是用的是JGroup。 JGroup功能十分强大,通过配置各种参数就可以充分利用它所提供的各项功能。JGroup最大的特点就是支持协议栈的...

    jgroups-2.2.8.jar

    jgroups-2.2.8.jar.........

Global site tag (gtag.js) - Google Analytics