in commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/remote/server/RemoteCacheServer.java [1135:1222]
public <KK, VV> void addCacheListener( final String cacheName, final ICacheListener<KK, VV> listener )
throws IOException
{
if ( cacheName == null || listener == null )
{
throw new IllegalArgumentException( "cacheName and listener must not be null" );
}
final CacheListeners<KK, VV> cacheListeners;
final IRemoteCacheListener<KK, VV> ircl = (IRemoteCacheListener<KK, VV>) listener;
final String listenerAddress = ircl.getLocalHostAddress();
final RemoteType remoteType = ircl.getRemoteType();
if ( remoteType == RemoteType.CLUSTER )
{
log.debug( "adding cluster listener, listenerAddress [{0}]", listenerAddress );
cacheListeners = (CacheListeners<KK, VV>)getClusterListeners( cacheName );
}
else
{
log.debug( "adding normal listener, listenerAddress [{0}]", listenerAddress );
cacheListeners = (CacheListeners<KK, VV>)getCacheListeners( cacheName );
}
final Map<Long, ICacheEventQueue<KK, VV>> eventQMap = cacheListeners.eventQMap;
cleanupEventQMap( eventQMap );
// synchronized ( listenerId )
synchronized ( ICacheListener.class )
{
long id = 0;
try
{
id = listener.getListenerId();
// clients probably shouldn't do this.
if ( id == 0 )
{
// must start at one so the next gets recognized
final long listenerIdB = nextListenerId();
log.debug( "listener id={0} addded for cache [{1}], listenerAddress [{2}]",
listenerIdB & 0xff, cacheName, listenerAddress );
listener.setListenerId( listenerIdB );
id = listenerIdB;
// in case it needs synchronization
final String message = "Adding vm listener under new id = [" + listenerIdB + "], listenerAddress ["
+ listenerAddress + "]";
logApplicationEvent( "RemoteCacheServer", "addCacheListener", message );
log.info( message );
}
else
{
final String message = "Adding listener under existing id = [" + id + "], listenerAddress ["
+ listenerAddress + "]";
logApplicationEvent( "RemoteCacheServer", "addCacheListener", message );
log.info( message );
// should confirm the host is the same as we have on
// record, just in case a client has made a mistake.
}
// relate the type to an id
this.idTypeMap.put( Long.valueOf( id ), remoteType);
if ( listenerAddress != null )
{
this.idIPMap.put( Long.valueOf( id ), listenerAddress );
}
}
catch ( final IOException ioe )
{
final String message = "Problem setting listener id, listenerAddress [" + listenerAddress + "]";
log.error( message, ioe );
if ( cacheEventLogger != null )
{
cacheEventLogger.logError( "RemoteCacheServer", "addCacheListener", message + " - "
+ ioe.getMessage() );
}
}
final CacheEventQueueFactory<KK, VV> fact = new CacheEventQueueFactory<>();
final ICacheEventQueue<KK, VV> q = fact.createCacheEventQueue( listener, id, cacheName, remoteCacheServerAttributes
.getEventQueuePoolName(), remoteCacheServerAttributes.getEventQueueType() );
eventQMap.put(Long.valueOf(listener.getListenerId()), q);
log.info( cacheListeners );
}
}