2011-12-05 43 views
3

我有一些與JGroup鏡像的服務器。最近出現了一些意外行爲,它不同步並且基於日誌,Jgroup將不時斷開連接。我想在JGroup代碼中編寫一個小程序,在JGroup斷開連接併發送報告哪臺機器已斷開連接時發送電子郵件。Jgroup獲得物理地址

問題是,基於JavaDoc我似乎無法從成員或視圖中提取物理IP地址。任何人都知道我該怎麼做?

+0

請原諒我的無知 - 但爲什麼不是通道的物理地址與節點物理地址相同(可以使用InetAddress)? –

回答

3

這是一個黑客,但它的作品。 JGroups團隊已經表示這是危險的,因爲他們可以隨時更改底層代碼,所以謹慎使用。

public void receive(Message msg) { 
    String srcIp; 
    Address addr = msg.getSrc(); 

    PhysicalAddress physicalAddr = (PhysicalAddress)channel.down(new Event(Event.GET_PHYSICAL_ADDRESS, addr)); 

    if(physicalAddr instanceof IpAddress) { 
     IpAddress ipAddr = (IpAddress)physicalAddr; 
     InetAddress inetAddr = ipAddr.getIpAddress(); 
     srcIp = inetAddr.getHostAddress(); 
    } 
} 
0

我不確定你能不能,我無法弄清楚如何。我最終做的是添加節點的IP作爲廣播消息的一部分。它需要一些額外的編碼,但它工作。

+0

我同意。 'JGroups'沒有提供直接的方法來檢索頻道的物理地址 –

1

要精心Cavyn VonDeylen的辦法:讓一個給定信道的物理地址

JGroups的2.X:

PhysicalAddress physicalAddress = (PhysicalAddress) 
     channel.downcall(
     new Event(
      Event.GET_PHYSICAL_ADDRESS, channel.getAddress() 
     ) 
    ); 

的JGroups 3.X:通道。 downcall()已被刪除;所以Channel.down()已被更改爲取代以前的功能。

PhysicalAddress physicalAddress = (PhysicalAddress) 
     channel.down(
     new Event(
      Event.GET_PHYSICAL_ADDRESS, channel.getAddress() 
     ) 
    ); 

而不管任何的JGroups版本中,physicalAddress將在IP的形式返回一個字符串:端口格式。

+0

您應該轉換爲IpAddress,並使用單獨的方法將InetAddress與端口一起獲取。 –