JBoss 系列十二通过一个简单群组聊天程序演示“JBoss 系列九: Bela Ban's JGroups Manual 翻译 III - JGroups API”中JGroups API的使用,希望读者能够通过本示例知道如何使用JGroups API构建自己的多播通信应用。本系列内容包括:
使用示JBoss Cluster Framework Demo 介绍所示的方法,任意从SourceForge下载或编译生成DEMO_HOME(为了方便描述,我们编译生成的Demo目录,或解压jboss_cluster_framework.*.zip得到的Demo目录称之为DEMO_HOME)。DEMO_HOME/bin目录下包含启动群组聊天程序的启动脚本(chat.sh,chat.bat)。
使用启动脚本附加-n参数指定群组的节点名字如下:
./chat.sh -n node1
./chat.sh -n node2
注意:Windows系统下使用chat.bat。
到此node1和node2可以进行聊天,互相发送消息,事实上我们可以启动多个节点,多个节点中的任何一个节点可以发送消息给其他节点,当然多个节点中的任何一个节点都可以收到其他节点发送的消息,下图为两个节点群组聊天示意图。
本示例完整代码链接:https://github.com/kylinsoong/cluster/.../jgroups/demo/ChatDemo.java
31 public class ChatDemo extends ReceiverAdapter
40 public void receive(Message msg) { 41 Address sender = msg.getSrc(); 42 println("[" + sender + "] " + msg.getObject()); 43 } 44
52 channel = new JChannel(); 53 if(null != name) { 54 channel.setName(name); 55 } 56 channel.setReceiver(this); 57 channel.setDiscardOwnMessages(true); 58 channel.connect(clusterName);
如上52行初始化了一个通道,JChannel构造方法如果没有参数传递时,默认classpath下的udp.xml被使用;54行设定当前通道的名字,我们看到的节点名字node1,node2是在此处设定的;56行设定通道接收者,由于ChatDemo类继承ReceiverAdapter类,所以这行代码使我们重写的receive()和viewAccepted()方法起作用;57行忽略自己发送的消息,jGroups使用多播机制传递消息,所有物理网络地址都会接收到群组消息,该行代码过滤掉自己发送给自己的消息;58行使通道处于连接状态,通道只有在连接状态才可以接收和发送消息给群组中的成员。