在上部分的介绍中,已经可以直接使用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文档》
分享到:
相关推荐
JavaGroups—构建分布式通信的基础(上) JavaGroups 是一种可靠组通信工具,在同一个台主机、局域网甚至是广域网中,组成员可以加入一个组,发送消息给其它的组成员并从其它成员中接收消息,系统跟踪所有组成员...
apathe+tomcat集群用的,• JavaGroups是一个实现集群服务实体间通信的通信协议
在毕业设计中,利用JavaGroups构建系统,可以实现高效、可靠的组通信功能,对于分布式系统或者需要多节点协作的项目尤为适用。通过深入理解Java的核心特性和JavaGroups的机制,学生可以构建出高效、稳定且跨平台的...
JGroups是一个高性能、可扩展且易于使用的分布式通信库,用于实现集群中的节点之间的消息传递。它支持多种传输层协议,如UDP、TCP等,并提供了一系列高级特性,比如组播、广播、心跳检测以及故障恢复机制等。通过...
该项目包含一个适用于Tomcat 5群集的会话管理器插件,该插件旨在通过使用单个“伙伴”备份而不是完整复制来进行扩展。 它使用jcluster API(http://jcluster.dev.java.net)作为通信机制。
SwarmCache利用了JavaGroups进行节点间的通信,并通过多播(multicast)技术来同步缓存状态。 #### 二、SwarmCache的工作原理 SwarmCache的核心组件包括`Manager`和`Cache`。每个节点都需要一个`Manager`来管理其...
1. **安装和准备软件**:需要Tomcat服务器(如4.12版本)、Apache HTTP服务器(如2.0.43版本)、JavaGroups用于服务实体间的通信、Tomcat会话复制库基于JavaGroups实现会话同步,以及JK2模块作为Apache和Tomcat之间...
有多份毕设及论文 传统的会议总是需要先预定时间、地点,统一开会人员及布置会场、记录、主持等,会议所要解决的问题或是要制定的方案、决策常常由于...说明了一个基于JavaGroups工具包的小型视频会议系统的设计和实现。
kot(Keep on Talking)是用Java编写并基于JavaGroups的通信工具。 它可以用作许多人可以互相交谈的公共聊天。 它也可以用作类似于Messenger的工具(Gaim,MSN等)进行一对一的通信。
JavaGroups的成员关系管理体现在: 1,可以知道组内有哪些成员 2,成员的加入,离开,掉线等的通知 JavaGroups的主要功能特征: - 组的创建与删除。组成员能在LAN或WAN环境内互相发送消息 - 组的成员加入或离开...
为您提供JGroups通讯框架下载,JGroups是一个可靠的通信Java库。它由3部分组成:(1)一个类似于套接字的API,用于应用开发,(2)实现可靠的协议栈通讯(3)一组构件,这些构件为开发人员高级抽象(例如...
JK2是Apache Tomcat Connectors项目的一部分,用作Apache和Tomcat之间的插件,负责两者之间的通信。在集群配置中,JK2作为负载均衡器,根据预设策略将HTTP请求分配到不同的Tomcat实例。 **4. 配置负载均衡器步骤** ...
JBoss支持多种关键技术和服务,包括JNDI、Servlet/JSP(使用Tomcat或Jetty)、EJB、JTS/JTA、JCA、JMS等,同时兼容集群(如JavaGroups)、Web服务(如Axis)和IIOP(JacORB)集成。 ### 版本与许可 JBoss的生产...
JGroups是一个可靠的通信Java库。它由3部分组成: (1)一个类似于套接字的API,用于应用开发, (2)实现可靠的协议栈通讯 (3)一组构件,这些构件为开发人员高级抽象(例如ReplicatedHashMap,java.util.Map的...
JavaGroups的成员关系管理体现在: 1、可以知道组内有哪些成员 2、成员的加入,离开,掉线等的通知 JavaGroups的主要功能特征: 1、组的创建与删除。组成员能在LAN或WAN环境内互相发送消息 2、组的成员加入或离开 3...
JGroups的可靠性体现在1,对所有接收者的消息的无丢失传输(通过丢失消息的重发)2,大消息的分割传输和重组3,消息的顺序发送和接收4,原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现在...
JGroups的可靠性体现在:1、对所有接收者的消息的无丢失传输(通过丢失消息的重发)2、大消息的分割传输和重组3、消息的顺序发送和接收4、原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现...
JGroups的可靠性体现在:1、对所有接收者的消息的无丢失传输(通过丢失消息的重发)2、大消息的分割传输和重组3、消息的顺序发送和接收4、原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现...
JGroups的可靠性体现在:1、对所有接收者的消息的无丢失传输(通过丢失消息的重发)2、大消息的分割传输和重组3、消息的顺序发送和接收4、原子性:消息要么被所有接收者接收,要么全不JavaGroups的成员关系管理体现...