`
phantom
  • 浏览: 160705 次
社区版块
存档分类
最新评论

JavaGroups—构建分布式通信的基础(下)

阅读更多
在上部分的介绍中,已经可以直接使用Jchannel构建一个简单的组通信,接下来将介绍一些在编程中比较常用的类和接口。
    一、基本接口:以下类位于org.jgroups包下
    1)MessageListener:消息监听器
以下内容为程序代码:

public interface MessageListener {
   void receive(Message msg);
   byte[] getState();
   void setState(byte[] state);
}

    2)ExtendedMessageListener:扩展消息监听器
以下内容为程序代码:

public interface ExtendedMessageListener extends MessageListener {
   byte[] getState(String state_id);
   void setState(String state_id, byte[] state);
}

    3)MemberShipListener:成员监听器
以下内容为程序代码:

public interface MembershipListener {
   void viewAccepted(View new_view);
   void suspect(Object suspected_mbr);
   void block();
}

   4)ChannelListener:通道监听器
以下内容为程序代码:

public interface ChannelListener {
   void channelConnected(Channel channel);
   void channelDisconnected(Channel channel);
   void channelClosed(Channel channel);
   void channelShunned();
   void channelReconnected(Address addr);
}

   5)Receiver:接受者
以下内容为程序代码:

public interface Receiver extends MessageListener, MembershipListener {
}

   6)ExtendedReceiver:扩展接受者
以下内容为程序代码:

public interface ExtendedReceiver extends ExtendedMessageListener, MembershipListener {
}

示例如下:
以下内容为程序代码:

JChannel ch=new JChannel();
ch.setReceiver(new ExtendedReceiverAdapter() {
  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"[img]/images/wink.gif[/img];

   在通道同时担当接受者和发送者时需要创建至少两个线程分担两个不同的工作,通过向Jchannel注册一个接受者(Receiver),使我们不需要自己显式地创建接受线程
   二、高层组件:以下类位于org.jgroups.blocks包下
   使用JavaGroups的基本接口和通道编程比较直接而直观,缺点是编程有时过于繁杂,JavaGroups为我们提供了一些高层的组件降低编程的难度。(以下类位于org.jgroups.blocks包下)
   1.拉推模式适配器(PullPushAdapter)
   一般直接使用Jchannel,是采用拉的方式,即用户自己编程去“推动”接收和发送信息,通过该适配器,即转换为由用户注册一个Listener,由适配器去“推动“接收和发送信息,例:
以下内容为程序代码:

public class PullPushTest implements MessageListener {
   Channel channel;
   PullPushAdapter adapter;
   byte[] data="Hello world".getBytes();
   public void receive(Message msg) {
      System.out.println("Received msg: " + msg);
   }
   public void start() throws Exception {
      channel=new JChannel();
      channel.connect("PullPushTest"[img]/images/wink.gif[/img];
      adapter=new PullPushAdapter(channel);
      adapter.setListener(this);
      for(int i=0; i < 10; i++) {
         System.out.println("Sending msg #" + i);
         channel.send(new Message(null, null, data));
         Thread.currentThread().sleep(1000);
      }
      adapter.stop();
      channel.close();
   }
   public static void main(String args[]) {
      try {
         new PullPushTest().start();
      }
      catch(Exception e) { /* error */ }
   }
}

   2.信息分发器(MessageDispatcher)
    Jchannel是采用异步的方式接受信息的,如果想使用同步接受信息,可使用该类,当然,该类也可用于异步接受信息,由于该类内部使用了PullPushAdapter,所以其也是“推“模式。例见下:
以下内容为程序代码:

public class MessageDispatcherTest implements RequestHandler {
   Channel channel;
   MessageDispatcher disp;
   RspList rsp_list;
   public void start() throws Exception {
      channel=new JChannel();
      disp=new MessageDispatcher(channel, null, null, this);
      channel.connect("MessageDispatcherTestGroup"[img]/images/wink.gif[/img];
      for(int i=0; i < 10; i++) {
          Thread.sleep(100);
          System.out.println("Casting message #" + i);
          rsp_list=disp.castMessage(null,
             new Message(null, null, new String("Number #" + i)),
                         GroupRequest.GET_ALL, 0);//GET_ALL表示等待所有信息发完
          System.out.println("Responses:\n" +rsp_list);
      }
      channel.close();
      disp.stop();
   }
   public Object handle(Message msg) {
      System.out.println("handle(): " + msg);
      return new String("Success !"[img]/images/wink.gif[/img];
   }
   public static void main(String[] args) {
      try {
         new MessageDispatcherTest().start();
      }
      catch(Exception e) {
         System.err.println(e);
      }
   }
}

   看看每次操作的返回结果RspList类的声明
以下内容为程序代码:

public class RspList {
   public boolean isReceived(Address sender);
   public int numSuspectedMembers();
   public Vector getResults();
   public Vector getSuspectedMembers();
   public boolean isSuspected(Address sender);
   public Object get(Address sender);
   public int size();
   public Object elementAt(int i) throws ArrayIndexOutOfBoundsException;
}
   其保存了每条信息的操作结果情况
   3.RPC分发器(RpcDispatcher)
   RPC用户远程与本地相同的对象的方法调用,见下面例子:
[code]
public class RpcDispatcherTest {
   Channel channel;
   RpcDispatcher disp;
   RspList rsp_list;
   public int print(int number) throws Exception {
      return number * 2;
   }
   public void start() throws Exception {
      channel=new JChannel(props);
      disp=new RpcDispatcher(channel, null, null, this);
      channel.connect("RpcDispatcherTestGroup"[img]/images/wink.gif[/img];
      for(int i=0; i < 10; i++) {
          Thread.sleep(100);
          rsp_list=disp.callRemoteMethods(null, "print", 
                new Integer(i), GroupRequest.GET_ALL, 0);
          System.out.println("Responses: " +rsp_list);
      }
      channel.close();
      disp.stop();
   }
   public static void main(String[] args) {
      try {
          new RpcDispatcherTest().start();
      }
      catch(Exception e) {
          System.err.println(e);
      }
   }
}

三、分布式数据结构:
    使用分布式数据结构可以在多个进程的内部保持数据结构的多个实例,在任何时刻每个实例都有相同的值,主要有DistributedHashtable、ReplicatedHashtable和DistributedTree,其使用比较直接,此处不再做详细举例

参考:《JGroups文档》
分享到:
评论

相关推荐

    GroupCo基础服务提供者.java版本.可以与GroupCo服务层无缝切换.rar

    JavaGroups—构建分布式通信的基础(上) JavaGroups 是一种可靠组通信工具,在同一个台主机、局域网甚至是广域网中,组成员可以加入一个组,发送消息给其它的组成员并从其它成员中接收消息,系统跟踪所有组成员...

    javagroups-2.0.jar

    apathe+tomcat集群用的,• JavaGroups是一个实现集群服务实体间通信的通信协议

    tomcat-javagroups-开源

    该项目包含一个适用于Tomcat 5群集的会话管理器插件,该插件旨在通过使用单个“伙伴”备份而不是完整复制来进行扩展。 它使用jcluster API(http://jcluster.dev.java.net)作为通信机制。

    java毕业设计论文java简介

    JavaGroups是一个由康奈尔大学开发的基于Java的工具包,它提供了可靠的组通信。 它的功能包含了向组内所有成员发送消息,并确保每个成员接收到相同序列的消息。它的基本概念是一个类似于BDS套接字的频道:用户可以给...

    图像处理毕业设计(论文)

    有多份毕设及论文 传统的会议总是需要先预定时间、地点,统一开会人员及布置会场、记录、主持等,会议所要解决的问题或是要制定的方案、决策常常由于...说明了一个基于JavaGroups工具包的小型视频会议系统的设计和实现。

    kot-开源

    kot(Keep on Talking)是用Java编写并基于JavaGroups的通信工具。 它可以用作许多人可以互相交谈的公共聊天。 它也可以用作类似于Messenger的工具(Gaim,MSN等)进行一对一的通信。

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

    JavaGroups的成员关系管理体现在: 1,可以知道组内有哪些成员 2,成员的加入,离开,掉线等的通知 JavaGroups的主要功能特征: - 组的创建与删除。组成员能在LAN或WAN环境内互相发送消息 - 组的成员加入或离开...

    JGroups通讯框架 v4.2.8

    为您提供JGroups通讯框架下载,JGroups是一个可靠的通信Java库。它由3部分组成:(1)一个类似于套接字的API,用于应用开发,(2)实现可靠的协议栈通讯(3)一组构件,这些构件为开发人员高级抽象(例如...

    JGroups通讯框架-其他

    JGroups是一个可靠的通信Java库。它由3部分组成: (1)一个类似于套接字的API,用于应用开发, (2)实现可靠的协议栈通讯 (3)一组构件,这些构件为开发人员高级抽象(例如ReplicatedHashMap,java.util.Map的...

    JGroups群组通讯工具包-其他

    JavaGroups的成员关系管理体现在: 1、可以知道组内有哪些成员 2、成员的加入,离开,掉线等的通知 JavaGroups的主要功能特征: 1、组的创建与删除。组成员能在LAN或WAN环境内互相发送消息 2、组的成员加入或离开 3...

    JGroups群组通讯工具包 v5.1.6

    JGroups的可靠性体现在1,对所有接收者的消息的无丢失传输(通过丢失消息的重发)2,大消息的分割传输和重组3,消息的顺序发送和接收4,原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现在...

    JGroups群组通讯工具包 v5.1.2

    JGroups的可靠性体现在:1、对所有接收者的消息的无丢失传输(通过丢失消息的重发)2、大消息的分割传输和重组3、消息的顺序发送和接收4、原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现...

    JGroups 群组通讯工具包 v5.0.4

    JGroups的可靠性体现在:1、对所有接收者的消息的无丢失传输(通过丢失消息的重发)2、大消息的分割传输和重组3、消息的顺序发送和接收4、原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现...

    JGroups群组通讯工具包 v5.1.3

    JGroups的可靠性体现在:1、对所有接收者的消息的无丢失传输(通过丢失消息的重发)2、大消息的分割传输和重组3、消息的顺序发送和接收4、原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现...

Global site tag (gtag.js) - Google Analytics