取得 Java.net.SocketException
マルチキャストプロバイダーを開始しようとした場合:
2013-09-11 11:45:44,204 [main] ERROR net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider: Error starting heartbeat. Error was: Can't assign requested address
Java.net.SocketException: Can't assign requested address
at Java.net.PlainDatagramSocketImpl.join(Native Method)
at Java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.Java:178)
at Java.net.MulticastSocket.joinGroup(MulticastSocket.Java:319)
at net.sf.ehcache.distribution.MulticastKeepaliveHeartbeatReceiver.init(MulticastKeepaliveHeartbeatReceiver.Java:88)
at net.sf.ehcache.distribution.MulticastRMICacheManagerPeerProvider.init(MulticastRMICacheManagerPeerProvider.Java:95)
これは、Java.net.NetworkInterface.getDefault()
から返されるIPv6アドレスが原因でした。私はMacbookでワイヤレスを使用していました-p2p0(AirDropに使用)がデフォルトのネットワークインターフェイスとして返されましたが、p2p0にはIPv6 ether
エントリしかありません(ipconfig
を実行することで見つかりました) 。
どちらも私のために働いた2つの解決策(有線または無線接続のどちらを使用していても機能するため、私は最初のものを好む)
-Djava.net.preferIPv4Stack=true
_を使用してJVMを起動します。これにより、Java.net.NetworkInterface.getDefault()
がvboxnet0ネットワークインターフェイスを返しました。ホストオンリーVMを実行していない場合に何が得られるかわかりません。受け入れられた答えのわずかなバリエーション:Javaコードに次のコード行を追加することもできます。
System.setProperty("Java.net.preferIPv4Stack", "true");
特定の構成をJava VMに追加してからでないと、マシンのマルチキャストソケットに参加できません。
接続を試みる前に次の行を追加して、IPv4アドレスのみを取得するようにします。
System.setProperty("Java.net.preferIPv4Stack", "true");
ほとんどの場合、コンピューターには複数のネットワークインターフェイスがあるため、正しいインターフェイスを選択する必要があります。
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
Enumeration<InetAddress> addressesFromNetworkInterface = networkInterface.getInetAddresses();
while (addressesFromNetworkInterface.hasMoreElements()) {
InetAddress inetAddress = addressesFromNetworkInterface.nextElement();
if (inetAddress.isSiteLocalAddress()
&& !inetAddress.isAnyLocalAddress()
&& !inetAddress.isLinkLocalAddress()
&& !inetAddress.isLoopbackAddress()
&& !inetAddress.isMulticastAddress()) {
socket.setNetworkInterface(NetworkInterface.getByName(networkInterface.getName()));
}
}
}
私の場合、認証を必要とするネットワークへのVPNの使用を開始したばかりでした。私のアプリは起動し、パイプを介してデータベースに接続できましたが、ehcach.xmlのIP 230.0.0.1を使用した分散キャッシュの構成が原因でした。本番環境ではすべて問題なく、ローカルで失敗し、別の戦略にロールバックするだけでしたが、VPNを介してマルチキャストリクエストに認証チャレンジが発生し、このエラーが発生しました。短期的な修正のみが必要だったため、これらの環境ではehcacheマルチキャスト構成を無効にし、正常に戻りました。
これはehcache.xml
の問題のある行で、コメントアウトされただけです
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"
/>