上面已經對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);