public UDPDiscoveryService()

in commons-jcs3-core/src/main/java/org/apache/commons/jcs3/utils/discovery/UDPDiscoveryService.java [114:203]


    public UDPDiscoveryService(final UDPDiscoveryAttributes attributes, IElementSerializer serializer)
    {
        this.udpDiscoveryAttributes = attributes.clone();
        this.serializer = serializer;

        try
        {
            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 (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,
                    getUdpDiscoveryAttributes().getUdpDiscoveryInterface(),
                    multicastAddress,
                    getUdpDiscoveryAttributes().getUdpDiscoveryPort() );
        }
        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();
    }