我有一些与 JGroup 镜像的服务器。最近有一些意想不到的行为,它不同步并且基于日志,Jgroup会不时断开连接。我想在 JGroup 代码中编写一个小程序,以便在 JGroup 断开连接并报告哪台机器断开连接后通过电子邮件发送出去。
问题是,基于 JavaDoc,我似乎无法从成员或视图中提取物理 IP 地址。任何人都知道我该怎么做?
这是一个黑客,但它有效。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();
}
}
详细阐述 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格式返回一个字符串。
我不确定你能不能,我也不知道怎么做。我最终做的是添加节点的 IP 作为广播消息的一部分。它需要一些额外的编码,但它可以工作。