上面已经对tribes的内部实现机制及原理进行了深入的剖析。在理解它的设计原理后看看怎样使用tribes。整个使用相当简单便捷,仅仅须要四步:

① 定义一个消息对象,因为这个消息对象是要在网络之间传递的,网络传输涉及到序列化。所以须要实现Serializable接口。

public class MyMessage implements Serializable {

private String message;

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

}

② 定义一个ChannelListener监听器。对消息的处理逻辑放在messageReceived方法中。

public class MyMessageListener implements ChannelListener{

public boolean accept(Serializable myMessage, Member member) {

return true;

}

public void messageReceived(Serializable myMessage, Member member) {

System.out.println(((MyMessage)myMessage).getMessage()+"  from  "+member.getName());

}

}

③ 定义一个MembershipListener监听器,对集群成员的增加及失效的逻辑处理。在memberAdded中对成员增加事件逻辑处理,在memberDisappeared中对成员失效事件逻辑处理。

public class MyMemberListener implements MembershipListener {

public void memberAdded(Member member) {

System.out.println(member.getName()+" Added");

}

public void memberDisappeared(Member member) {

System.out.println(member.getName()+" Disappeared");

}

}

④ 主程序。分别实例化ChannelListener、MembershipListener并增加到channel中,然后启动channel,因为集群通信须要启动几个节点才可实现,为方便操作这里引入args參数。当參数值为”r”时表示仅仅是启动一个节点并增加集群。而參数值为”s”时则表示启动节点增加集群后而且向集群全部成员发送Message,主程序使用循环睡眠是为了不让程序结束,一旦结束节点就不存在了。能够先带”r”參数执行两次,即意味着启动了两个节点,最后再带”s”參数执行,即第三个节点启动并向前两个成语节点发送消息,前两个节点分别输出了”hello  from  tcp://{169, 254, 75, 186}:4002”,而成员监听器则会在节点增加或失效时输出相似这种消息”tcp://{169, 254, 75, 186}:4002 Added”、”tcp://{169, 254, 75, 186}:4000 Disappeared”。

public class TribesTest {

public static void main(String[] args) throws ChannelException,InterruptedException {

Channel myChannel = new GroupChannel();

ChannelListener msgListener = new MyMessageListener();

MembershipListener mbrListener = new MyMemberListener();

myChannel.addMembershipListener(mbrListener);

myChannel.addChannelListener(msgListener);

myChannel.start(Channel.DEFAULT);

switch (args[0]) {

case ("r"):

while (true)

Thread.currentThread().sleep(1000);

case ("s"):

MyMessage myMsg = new MyMessage();

myMsg.setMessage("hello");

Member[] group = myChannel.getMembers();

myChannel.send(group, myMsg, Channel.SEND_OPTIONS_DEFAULT);

while (true)

Thread.currentThread().sleep(1000);

}

}

}

点击订购作者《Tomcat内核设计剖析》

集群通信组件tribes之用法的更多相关文章

  1. 集群通信组件Tribes之整体介绍

    接下来一系列文章会对集群通信框架tribes进行源码级别的分析,欢迎讨论. 把若干机器组合成一个集群,集群为了能协同工作,成员之间的通信是必不可少的,当然可以说这也是集群实现中重点需要解决的核心问题, ...

  2. 集群通信组件tribes之使用方法

    上面已经对tribes的内部实现机制及原理进行了深入的剖析,在理解它的设计原理后看看如何使用tribes,整个使用相当简单便捷,只需要四步: ① 定义一个消息对象,由于这个消息对象是要在网络之间传递的 ...

  3. 集群通信组件tribes之集群的平行通信

    前面的集群成员维护服务为我们提供了集群内所有成员的地址端口等信息,可以通过MembershipService可以轻易从节点本地的成员列表获取集群所有的成员信息,有了这些成员信息后就可以使用可靠的TCP ...

  4. 集群通信组件Tribes之如何维护集群成员信息

    一个集群包含若干成员,要对这些成员进行管理就必须要有一张包含所有成员的列表,当要对某个节点做操作时通过这个列表可以准确找到该节点的地址进而对该节点发送操作消息.如何维护这张包含所有成员的列表是本节要讨 ...

  5. 集群通信组件tribes之集群的消息接收通道

    与消息发送通道对应,发送的消息需要一个接收端接收消息,它就是ChannelReceiver.接收端负责接收处理其他节点从消息发送通道发送过来的消息,实际情况如图每个节点都有一个ChannelSende ...

  6. 集群通信组件Tribes之怎样维护集群成员信息

    一个集群包括若干成员,要对这些成员进行管理就必需要有一张包括全部成员的列表.当要对某个节点做操作时通过这个列表能够准确找到该节点的地址进而对该节点发送操作消息.怎样维护这张包括全部成员的列表是本节要讨 ...

  7. 集群通信组件tribes之应用程序处理入口

    Tribes为了更清晰更好地划分职责,它被设计成用IO层和应用层,IO层专心负责网络传输方面的逻辑处理,把接收到的数据往应用层传送,当然应用层发送的数据也是通过此IO层发送,数据传往应用层后必须要留一 ...

  8. 集群通信组件tribes之通道拦截器

    拦截器应该可以说是一个很经典的设计模式,它有点类似于过滤器,当某信息从一个地方流向目的地的过程中,可能需要统一对信息进行处理,如果考虑到系统的可扩展性和灵活性通常就会使用拦截器模式,它就像一个个关卡被 ...

  9. 【原创】强撸基于 .NET 的 Redis Cluster 集群访问组件

    Hello 大家好,我是TANZAME,我们又见面了.今天我们来聊聊怎么手撸一个 Redis Cluster 集群客户端,纯手工有干货,您细品. 随着业务增长,线上环境的QPS暴增,自然而然将当前的单 ...

随机推荐

  1. Linux 经常使用快捷键

    桌面下: Alt+F5   取消最大化窗体 Alt+F9   最小化窗体  Alt+F10  最大化窗体  Alt+空格 打开窗体的控制菜单 (点击窗体左上角图标出现的菜单)     ctl+r   ...

  2. poj_2299Ultra-QuickSort,树状数组离散化

    求逆序数 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&g ...

  3. MDNS DDoS 反射放大攻击——攻击者假冒被攻击者IP向网络发送DNS请求,域名为“_services._dns-sd._udp.local”,这将引起本地网络中所有提供服务的主机都向被攻击者IP发送DNS响应,列举网络中所有服务

    MDNS Reflection DDoS 2015年3月,有报告叙述了mDNS 成为反射式和放大式 DDoS 攻击中所用媒介的可能性,并详述了 mDNS 反射式攻击的原理和相应防御方式.Q3,Akam ...

  4. 14.mocha+should.js

    转自http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html 众所周知对于任何一个项目来说,做好单元测试都是必不 ...

  5. python-深拷贝-浅拷贝

    python-深拷贝-浅拷贝 标签(空格分隔): 未分类 浅拷贝: 拷贝了引用,并没有拷贝内容 深拷贝: 深拷贝是对于一个对象所有层次的拷贝(递归)

  6. Asp.Net中使用水晶报表(中)

    Asp.Net中使用水晶报表(中) 使用Pull模式 我们将通过下面的这些步骤来通过Pull模式来执行水晶报表 1.首先创建rpt文件,并使用水晶报表设计接口设置一些必须的数据连接. 2.拖放一个 C ...

  7. C++中inline函数

    (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int ...

  8. 由浅入深讲解数据库中Synonym的使用方法

    1.Synonym的概念 Synonym(同义词)是SQL Server 2005的新特性.推出已经有几年的时间了.我们可以简单的理解Synonym为其他表的别名.本文中使用Northwind数据库为 ...

  9. Futures and promises

    In computer science, future, promise, delay, and deferred refer to constructs used for synchronizing ...

  10. [USACO5.4]奶牛的电信Telecowmunication(网络流)

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...