in commons-jcs3-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java [100:186]
public UDPDiscoveryService(final UDPDiscoveryAttributes attributes, final IElementSerializer serializer)
{
this.udpDiscoveryAttributes = attributes.clone();
this.serializer = serializer;
try
{
final InetAddress multicastAddress = InetAddress.getByName(
getUdpDiscoveryAttributes().getUdpDiscoveryAddr());
// Set service address if still empty
if (getUdpDiscoveryAttributes().getServiceAddress() == null ||
getUdpDiscoveryAttributes().getServiceAddress().isEmpty())
{
// Use same interface as for multicast
NetworkInterface serviceInterface = null;
if (getUdpDiscoveryAttributes().getUdpDiscoveryInterface() != null)
{
serviceInterface = NetworkInterface.getByName(
getUdpDiscoveryAttributes().getUdpDiscoveryInterface());
}
else
{
serviceInterface = HostNameUtil.getMulticastNetworkInterface();
}
try
{
InetAddress serviceAddress = null;
for (final Enumeration<InetAddress> addresses = serviceInterface.getInetAddresses();
addresses.hasMoreElements();)
{
serviceAddress = addresses.nextElement();
if (multicastAddress instanceof Inet6Address)
{
if (serviceAddress instanceof Inet6Address &&
!serviceAddress.isLoopbackAddress() &&
!serviceAddress.isMulticastAddress() &&
serviceAddress.isLinkLocalAddress())
{
// if Multicast uses IPv6, try to publish our IPv6 address
break;
}
} else if (serviceAddress instanceof Inet4Address &&
!serviceAddress.isLoopbackAddress() &&
!serviceAddress.isMulticastAddress() &&
serviceAddress.isSiteLocalAddress())
{
// if Multicast uses IPv4, try to publish our IPv4 address
break;
}
}
if (serviceAddress == null)
{
// Nothing found for given interface, fall back
serviceAddress = HostNameUtil.getLocalHostLANAddress();
}
getUdpDiscoveryAttributes().setServiceAddress(serviceAddress.getHostAddress());
}
catch ( final UnknownHostException e )
{
log.error( "Couldn't get local host address", e );
}
}
// todo need some kind of recovery here.
receiver = new UDPDiscoveryReceiver( this::processMessage,
getUdpDiscoveryAttributes().getUdpDiscoveryInterface(),
multicastAddress,
getUdpDiscoveryAttributes().getUdpDiscoveryPort() );
receiver.setSerializer(serializer);
}
catch ( final IOException e )
{
log.error( "Problem creating UDPDiscoveryReceiver, address [{0}] "
+ "port [{1}] we won't be able to find any other caches",
getUdpDiscoveryAttributes().getUdpDiscoveryAddr(),
getUdpDiscoveryAttributes().getUdpDiscoveryPort(), e );
}
// initiate sender broadcast
initiateBroadcast();
}