Jgroup获得物理地址

时间:2011-12-05 08:12:37

标签: java jgroups

我有一些与JGroup镜像的服务器。最近有一些意外的行为,它不同步并基于日志,Jgroup将不时断开连接。我想在JGroup代码中编写一个小程序,一旦JGroup断开连接并报告哪台机器已断开连接,就会发送电子邮件。

问题是,基于JavaDoc我似乎无法从成员或视图中提取物理IP地址。任何人都知道我该怎么做?

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

详细阐述Cavyn VonDeylen的方法:获取给定频道的实际地址

jgroups 2.x:

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

jgroups 3.x: Channel.downcall()已被删除;所以 Channel.down()已更改为替换以前的功能。

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

无论是任何jgroups版本, physicalAddress 都会以 IP:port 格式返回一个字符串。

答案 2 :(得分:0)

我不确定你能不能,我也无法弄明白。我最终做的是添加节点的IP作为广播消息的一部分。它需要一些额外的编码,但它可以工作。