java ehcache ipv6 multicast multicastsocket

Obteniendo `No se puede asignar la dirección solicitada` java.net.SocketException usando la multidifusión Ehcache



ipv6 multicast (4)

Obteniendo java.net.SocketException al intentar iniciar un proveedor de multidifusión:

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)


Debe agregar ciertas configuraciones a la máquina virtual Java antes de poder unir una toma de multidifusión en cualquier máquina.

Primero agregue esta línea antes de intentar cualquier conexión para asegurarse de que obtendrá solo las direcciones IPv4:

System.setProperty("java.net.preferIPv4Stack", "true");

En la mayoría de los casos, su computadora tiene más de una interfaz de red, por lo que debe elegir la correcta:

Enumeration e = NetworkInterface.getNetworkInterfaces(); while (e.hasMoreElements()) { NetworkInterface n = (NetworkInterface) e.nextElement(); Enumeration ee = n.getInetAddresses(); while (ee.hasMoreElements()) { InetAddress i = (InetAddress) ee.nextElement(); if (i.isSiteLocalAddress() && !i.isAnyLocalAddress() && !i.isLinkLocalAddress() && !i.isLoopbackAddress() && !i.isMulticastAddress()) { socket.setNetworkInterface(NetworkInterface.getByName(n.getName())); } } }


En mi caso, recién comencé a usar una VPN en una red que requería autenticación. Comenzaría mi aplicación y podría conectarme a sus bases de datos a través de la multa, pero la causa fue mi configuración para la memoria caché distribuida utilizando la dirección IP 230.0.0.1 en ehcach.xml. En producción todo estaba bien, localmente simplemente fallaría y se revertiría a una estrategia diferente, pero a través de la VPN las solicitudes de multidifusión se encontraron con un desafío de autenticación y este error fue el resultado. Solo requería una solución a corto plazo, por lo que en estos entornos desactivo la configuración de multidifusión ehcache y todo vuelve a la normalidad.

Esta fue la línea ofensiva en ehcache.xml que simplemente fue comentada

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32" />


Esto fue causado por una dirección IPv6 que se devolvió desde java.net.NetworkInterface.getDefault() . Estoy en una Macbook y estaba usando la conexión inalámbrica - p2p0 (usado para AirDrop) fue devuelto como la interfaz de red predeterminada, pero mi p2p0 solo tiene una entrada de ethernet IPv6 (que se encuentra al ejecutar ipconfig ).

Dos soluciones, ambas me funcionaron (prefiero la primera porque funciona tanto si está utilizando una conexión por cable o inalámbrica)

  1. Inicie la JVM con -Djava.net.preferIPv4Stack=true . Esto provocó que java.net.NetworkInterface.getDefault() devolviera mi interfaz de red vboxnet0; no estoy seguro de lo que obtendrá si no está ejecutando una máquina virtual solo de host.
  2. Desactivar la conexión inalámbrica y usar una conexión por cable

Una ligera variación en la respuesta aceptada: también puede agregar la siguiente línea de código a su código java:

System.setProperty("java.net.preferIPv4Stack", "true");