blob: 3a8824f26c31c471990558e4c08f38dd9983116b [file] [log] [blame]
package org.apache.commons.jcs.utils.discovery;
import java.io.IOException;
import java.util.ArrayList;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.commons.jcs.log.Log;
import org.apache.commons.jcs.log.LogManager;
/**
* Used to periodically broadcast our location to other caches that might be listening.
*/
public class UDPDiscoverySenderThread
implements Runnable
{
/** The logger. */
private static final Log log = LogManager.getLog( UDPDiscoverySenderThread.class );
/**
* details of the host, port, and service being advertised to listen for TCP socket connections
*/
private final UDPDiscoveryAttributes attributes;
/** List of known regions. */
private ArrayList<String> cacheNames = new ArrayList<>();
/**
* @param cacheNames The cacheNames to set.
*/
protected void setCacheNames( ArrayList<String> cacheNames )
{
log.info( "Resetting cacheNames = [{0}]", cacheNames );
this.cacheNames = cacheNames;
}
/**
* @return Returns the cacheNames.
*/
protected ArrayList<String> getCacheNames()
{
return cacheNames;
}
/**
* Constructs the sender with the port to tell others to connect to.
* <p>
* On construction the sender will request that the other caches let it know their addresses.
* @param attributes host, port, etc.
* @param cacheNames List of strings of the names of the region participating.
*/
public UDPDiscoverySenderThread( UDPDiscoveryAttributes attributes, ArrayList<String> cacheNames )
{
this.attributes = attributes;
this.cacheNames = cacheNames;
log.debug( "Creating sender thread for discoveryAddress = [{0}] and "
+ "discoveryPort = [{1}] myHostName = [{2}] and port = [{3}]",
() -> attributes.getUdpDiscoveryAddr(),
() -> attributes.getUdpDiscoveryPort(),
() -> attributes.getServiceAddress(),
() -> attributes.getServicePort() );
try (UDPDiscoverySender sender = new UDPDiscoverySender( attributes.getUdpDiscoveryAddr(),
attributes.getUdpDiscoveryPort() ))
{
// move this to the run method and determine how often to call it.
sender.requestBroadcast();
log.debug( "Sent a request broadcast to the group" );
}
catch ( IOException e )
{
log.error( "Problem sending a Request Broadcast", e );
}
}
/**
* Send a message.
*/
@Override
public void run()
{
// create this connection each time.
// more robust
try (UDPDiscoverySender sender = new UDPDiscoverySender( attributes.getUdpDiscoveryAddr(),
attributes.getUdpDiscoveryPort() ))
{
sender.passiveBroadcast( attributes.getServiceAddress(), attributes.getServicePort(), cacheNames );
// todo we should consider sending a request broadcast every so
// often.
log.debug( "Called sender to issue a passive broadcast" );
}
catch ( IOException e )
{
log.error( "Problem calling the UDP Discovery Sender [{0}:{1}]",
attributes.getUdpDiscoveryAddr(),
attributes.getUdpDiscoveryPort(), e );
}
}
/**
* Issues a remove broadcast to the others.
*/
protected void shutdown()
{
// create this connection each time.
// more robust
try (UDPDiscoverySender sender = new UDPDiscoverySender( attributes.getUdpDiscoveryAddr(),
attributes.getUdpDiscoveryPort() ))
{
sender.removeBroadcast( attributes.getServiceAddress(), attributes.getServicePort(), cacheNames );
log.debug( "Called sender to issue a remove broadcast in shudown." );
}
catch ( IOException e )
{
log.error( "Problem calling the UDP Discovery Sender", e );
}
}
}