我有一个3节点JGroups集群正常工作。有没有办法通过通信协议从其他节点检索bind_addr
属性?
本质上,我试图获取发送方的IP地址(在接收方上),或者更改dead
中view
节点的IP地址。有这样的方式吗?
此外,类Address
包含hostname
,我们是否可以将此类配置为包含IP地址(bind_addr
)以便我可以使用?
address instanceof IpAddress
此人返回false
(因为它是UUID
的实例)。
在当前节点上:
GMS gms = (GMS) stack.findProtocol(GMS.class);
logger.info("GMS.local address : "+gms.getLocalAddress());
它返回hostname
:(
我知道建议使用hostname
,但我还想在消息请求/群集加入/离开视图更改中检索bind_addr
。
任何帮助?
ProtocolStack stack = channel.getProtocolStack();
final TCP tcp = (TCP) stack.findProtocol(TCP.class);
channel.addAddressGenerator(new AddressGenerator() {
public Address generateAddress() {
ExtendedUUID retval = ExtendedUUID.randomUUID();
retval.put("ip", tcp.getBindAddress().getAddress());
return retval;
}
});
channel.connect(clusterName);
byte[] ipAsByteArray =((ExtendedUUID)sourceAddress).get("ip");
String str=Util.bytesToString(ipAsByteArray);
这会打印垃圾字符:|
答案 0 :(得分:1)
关于检索IP,您应该掌握传输协议(UDP
或TCP
)并致电getBindAddress()
。
您可以通过自定义地址发送此信息。为此,您需要使用AddressGenerator
:
JChannel ch=new JChannel();
ch.addAddressGenerator(new AddressGenerator() {
public Address generateAddress() {
ExtendedUUID extendedAddress=ExtendedUUID.randomUUID();
retval.put("ip", Util.stringToBytes(transportProtocol.getBindAddress().getAddress()));
return extendedAddress;
}
});
ch.connect("my-cluster");
ExtendedUUID
基本上是一种向地址添加额外负载的方法,但请注意,此有效负载随所有消息一起发送(保持较小!)
要检索有效负载,您需要从消息中获取地址并执行以下操作:
Address sourceAddress = message.getSrc();
byte[] ipAsByteArray =((ExtendedUUID)sourceAddress).get("ip");
String str=Util.bytesToString(ipAsByteArray);