2012-07-25 57 views
1

我必須在廣域網上創建具有單個接收器和多個發送器的集羣。 問題在於,在每個成員調用JChannel.connect()並使用相同的clustername後,沒有創建具有公共視圖的公共集羣,但每個組件都看到它自己的集羣。 結果是,當向接收者發送消息時,後者的物理地址不能被確定,並且所有消息都被摻雜。成員不會形成集羣

發件人:

package mydemo; 

import org.jgroups.Address; 
import org.jgroups.JChannel; 
import org.jgroups.ReceiverAdapter; 

public class Sender { 
JChannel channel; 
Address receiver; 
String group; 
String props; 
String name; 

public Sender(Address rcv, String group, String props, String name) { 
    receiver = rcv; 
    this.group = group; 
    this.props = props; 
    this.name = name; 
    try { 
     channel = new JChannel(props); 
     //channel.setName(group); 
     channel.connect(group); 
     System.out.println("View size(sender): " + channel.getView().getMembers().size()); 
     System.out.println("Sender address: " + channel.getView().getMembers().get(0)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void sendMessage() throws Exception { 
    channel.send(receiver,"Hello, I am "+name); 
} 

public void setReceiverAdapter(ReceiverAdapter adapter) { 
    channel.setReceiver(adapter); 
} 

} 

接收機:

package mydemo; 

import java.util.LinkedList; 
import java.util.List; 

import org.jgroups.JChannel; 
import org.jgroups.Message; 
import org.jgroups.ReceiverAdapter; 
import org.jgroups.View; 

public class ClusterTest extends ReceiverAdapter { 
JChannel channel; 
List<Sender> senders; 

public ClusterTest(int num, String props, String name) 
     throws Exception { 
    senders = new LinkedList<Sender>(); 
    channel = new JChannel(props); 
    channel.setReceiver(this); 
    //channel.setName(name); 
    channel.connect(name); 
    System.out.println("Rcv address: " + channel.getView().getMembers().get(0)); 
    for (int i = 0; i < num; i++) { 
/*   senders.add(new Sender(channel.getView().getMembers().get(0), name, 
       props, "Sender" + i));*/ 
     senders.add(new Sender(channel.getAddress(), name, 
       props, "Sender" + i)); 
     senders.get(i).setReceiverAdapter(this); 
     System.out.println("View size(rcv): " + channel.getView().getMembers().size()); 
    } 
} 

public void receive(Message msg) { 
    System.out.println("received message " + msg); 
} 

public void viewAccepted(View view) { 
    System.out.println("received view " + view.toString()); 
} 

public void start() throws Exception { 
    for (Sender sender : senders) { 
     Thread.sleep(3000); 
     sender.sendMessage(); 
    } 
    channel.close(); 
} 

public static void main(String[] args) throws Exception { 
    new ClusterTest(3, "d:/sth/MyDemo/src/conf/tcp.xml", "TestGroup").start(); 
} 
} 

由JGroups的提供的tcp.xml用在TCPPING小的變化使用:

<TCPPING timeout="3000" 
     initial_hosts="${jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801],localhost[7802], 
      localhost[7803],localhost[7804],localhost[7805],localhost[7806],localhost[7807],localhost[7808], 
      localhost[7809],localhost[7810],localhost[7811],localhost[7812],localhost[7813],localhost[7814], 
      localhost[7815],localhost[7816]}" 
     port_range="10" 
     num_initial_members="11"/> 

輸出:

GMS: address=myhost-42336, cluster=TestGroup, physical address=192.168.3.1:7806 

received view [myhost-42336|0] [myhost-42336] 

Rcv address: myhost-42336 


GMS: address=myhost-48774, cluster=TestGroup, physical address=192.168.3.1:7807 

View size(sender): 1 

Sender address: myhost-48774 

View size(rcv): 1 


GMS: address=myhost-38597, cluster=TestGroup, physical address=192.168.3.1:7808 

View size(sender): 1 

Sender address: myhost-38597 

View size(rcv): 1 


GMS: address=myhost-55548, cluster=TestGroup, physical address=192.168.3.1:7809 

View size(sender): 1 

Sender address: myhost-55548 

View size(rcv): 1 

WARNING: myhost-48774: no physical address for myhost-42336, dropping message 

WARNING: myhost-48774: no physical address for myhost-42336, dropping message 

WARNING: myhost-38597: no physical address for myhost-42336, dropping message 

WARNING: myhost-38597: no physical address for myhost-42336, dropping message 

WARNING: myhost-48774: no physical address for myhost-42336, dropping message 

... 

你能幫我嗎?也許這個概念是錯誤的,但是當目標在WAN上工作時,我必須使用單播和TCP。

+0

設置日誌記錄後,我在所有節點的跟蹤中發現了這樣的行:4906 [TRACE] TCPConnectionMap $ Mapper: - 無法創建到127.0.0.1:7800的連接 – Katalin 2012-07-26 12:25:06

+1

問題已解決:我將tcp.xml中的localhost替換爲real IP。 – Katalin 2012-07-26 14:15:10

回答

2

確保'localhost'不會解析爲127.0.0.1,而是解析到您列出的某個地址。我建議用-Djgroups.bind_addr = 1.2.3.4啓動一個實例,其中1.2.3.4列在'initial_hosts'中。