获取“Can';t使用Ehcache多播分配请求的地址`java.net.SocketException

获取“Can';t使用Ehcache多播分配请求的地址`java.net.SocketException,java,ehcache,ipv6,multicast,multicastsocket,Java,Ehcache,Ipv6,Multicast,Multicastsocket,尝试启动多播提供程序时获取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 r

尝试启动多播提供程序时获取
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(用于空投)作为默认网络接口返回,但我的p2p0只有一个IPv6
ether
条目(通过运行
ipconfig
找到)

两种解决方案,两种都对我有效(我更喜欢第一种,因为无论您使用有线还是无线连接,它都有效)

  • 使用
    -Djava.net.preferIPv4Stack=true启动JVM
    。这导致
    java.net.NetworkInterface.getDefault()
    返回我的vboxnet0网络接口--不确定如果不运行纯主机VM会得到什么
  • 关闭无线并使用有线连接

  • 在我的例子中,我刚刚开始使用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"
    />
    

    对已接受的答案稍作修改:您还可以向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()));
            }
        }
    }
    
    枚举networkInterfaces=NetworkInterface.getNetworkInterfaces(); while(networkInterfaces.hasMoreElements()){ NetworkInterface NetworkInterface=networkInterfaces.nextElement(); 枚举地址fromNetworkInterface=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()); } } }
    谢谢,在我厌倦之前,我无法让mulitcast在我的macbook上工作。
    java-Djava.net.preferIPv4Stack=true MyProgram
    以下是使用maven:Awesome解决方案时如何设置这些属性!!经过一天的调试,终于找到了这个!!更多ppl应该会看到。对于那些想知道如何在Eclipse中设置-Djava.net.preferIPv4Stack=true的人:右键单击项目并选择“运行方式”,然后选择“运行配置…”。将“-Djava.net.preferIPv4Stack=true”附加到VM参数中,然后单击“应用”;至少在macOS下,“java.net.preferIPv4Stack”-属性仅在JVM启动时读取–以编程方式设置它没有任何效果。@K.Biermann使用属性管理应用程序配置数据有不同的方法,用户3697700向我们展示的方法可以很好地工作。再见,谢谢。这在我的MacBook上很管用。只设置JVM设置不起作用。