繁体   English   中英

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

[英]Getting `Can't assign requested address` java.net.SocketException using Ehcache multicast

尝试启动多播提供程序时出现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 Micro 服务器。 'java -Djava.net.preferIPv4Stack=true -jar pm.jar --deploy /Users/jukana/NetBeansProjects/hello-todo/target/hello-todo.war --port 8080'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM