JGroups 从收到的消息中获取 IPAddess/bind_addr

JGroups fetch IPAddess/bind_addr from a received Message

我有一个工作正常的 3 节点 JGroups 集群。有什么方法可以通过通信协议从其他节点检索 bind_addr 属性 吗? 本质上,我正在尝试获取发送方的 IP 地址(在接收方上),或更改后的 viewdead 节点的 IP 地址。有这样的方法吗?

此外,class Address 包含 hostname,我们能否将此 class 配置为包含 IP 地址 (bind_addr),以便我可以利用?

address instanceof IpAddress这家伙returns我false(因为它是UUID的一个实例)。

在当前节点上: GMS gms = (GMS) stack.findProtocol(GMS.class); logger.info("GMS.local address : "+gms.getLocalAddress()); 它 returns 我 hostname :(

我知道建议使用 hostname,但我还想在消息 requests/cluster join/leave 视图更改中检索 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);

这会打印垃圾字符:|

关于检索IP,您应该掌握传输协议(UDPTCP)并调用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);