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

时间:2015-06-07 23:40:38

标签: jgroups

我有一个3节点JGroups集群正常工作。有没有办法通过通信协议从其他节点检索bind_addr属性?  本质上,我试图获取发送方的IP地址(在接收方上),或者更改deadview节点的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);

这会打印垃圾字符:|

1 个答案:

答案 0 :(得分:1)

关于检索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);