我有一些与JGroup镜像的服务器。最近有一些意外的行为,它不同步并基于日志,Jgroup将不时断开连接。我想在JGroup代码中编写一个小程序,一旦JGroup断开连接并报告哪台机器已断开连接,就会发送电子邮件。
问题是,基于JavaDoc我似乎无法从成员或视图中提取物理IP地址。任何人都知道我该怎么做?
答案 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作为广播消息的一部分。它需要一些额外的编码,但它可以工作。