web-dev-qa-db-ja.com

Ehcacheマルチキャストを使用して「要求されたアドレスを割り当てることができません」Java.net.SocketExceptionを取得する

取得 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)
35
eebbesen

これは、Java.net.NetworkInterface.getDefault()から返されるIPv6アドレスが原因でした。私はMacbookでワイヤレスを使用していました-p2p0(AirDropに使用)がデフォルトのネットワークインターフェイスとして返されましたが、p2p0にはIPv6 etherエントリしかありません(ipconfigを実行することで見つかりました) 。

どちらも私のために働いた2つの解決策(有線または無線接続のどちらを使用していても機能するため、私は最初のものを好む)

  1. _-Djava.net.preferIPv4Stack=true_を使用してJVMを起動します。これにより、Java.net.NetworkInterface.getDefault()がvboxnet0ネットワークインターフェイスを返しました。ホストオンリーVMを実行していない場合に何が得られるかわかりません。
  2. ワイヤレスをオフにして有線接続を使用する
89
eebbesen

受け入れられた答えのわずかなバリエーション:Javaコードに次のコード行を追加することもできます。

System.setProperty("Java.net.preferIPv4Stack", "true");
10
user3697700

特定の構成を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()));
        }
    }
}
7
Camilo Ortegón

私の場合、認証を必要とするネットワークへの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"
/>
0
Michael Gannon