获取"无法分配请求的地址"java.net.SocketException 使用 Ehcache 多播



尝试启动多播提供程序时获取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找到)。

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

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

接受的答案略有不同: 您还可以将以下代码行添加到 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"
/>

要添加到eebbesen的答案(最正确/最投票的答案),您可以在部署到服务器时从终端设置"Djava.net.preferIPv4Stack=true"。

在下面的案例/示例中,我正在部署到Payara微型服务器。'java -Djava.net.preferIPv4Stack=true -jar pm.jar --deploy/Users/jukana/NetBeansProjects/hello-todo/target/hello-todo.war --port 8080'

相关内容

最新更新