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を追加することです。追加のコーディングが必要ですが、機能します。