3

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

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

4

3 回答 3

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();
    }
}
于 2011-12-21T20:09:25.833 回答
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格式返回一个字符串。

于 2013-06-26T04:17:23.530 回答
0

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

于 2011-12-05T09:17:14.887 回答