You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jcs-dev@jakarta.apache.org by as...@apache.org on 2008/08/14 00:14:48 UTC
svn commit: r685702 [3/5] - in /jakarta/jcs/trunk: ./
src/java/org/apache/jcs/auxiliary/ src/java/org/apache/jcs/auxiliary/disk/
src/java/org/apache/jcs/auxiliary/disk/block/
src/java/org/apache/jcs/auxiliary/disk/indexed/
src/java/org/apache/jcs/auxil...
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServer.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServer.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServer.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServer.java Wed Aug 13 15:14:46 2008
@@ -1,22 +1,18 @@
package org.apache.jcs.auxiliary.remote.server;
/*
- * 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.
+ * 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 java.io.IOException;
@@ -43,32 +39,29 @@
import org.apache.jcs.engine.CacheEventQueueFactory;
import org.apache.jcs.engine.CacheListeners;
import org.apache.jcs.engine.behavior.ICacheElement;
+import org.apache.jcs.engine.behavior.ICacheEventLogger;
import org.apache.jcs.engine.behavior.ICacheEventQueue;
import org.apache.jcs.engine.behavior.ICacheListener;
import org.apache.jcs.engine.control.CompositeCache;
import org.apache.jcs.engine.control.CompositeCacheManager;
-/**
- * This class provides remote cache services. The remote cache server propagates
- * events from local caches to other local caches. It can also store cached
- * data, making it available to new clients.
- * <p>
- * Remote cache servers can be clustered. If the cache used by this remote cache
- * is configured to use a remote cache of type cluster, the two remote caches
- * will communicate with each other. Remote and put requests can be sent from
- * one remote to another. If they are configured to broadcast such event to
- * their client, then remove an puts can be sent to all locals in the cluster.
- * <p>
- * Get requests are made between clustered servers if AllowClusterGet is true. You can setup
- * several clients to use one remote server and several to use another. The get
- * locad will be distributed between the two servers. Since caches are usually
- * high get and low put, this should allow you to scale.
+/*
+ * This class provides remote cache services. The remote cache server propagates events from local
+ * caches to other local caches. It can also store cached data, making it available to new clients.
+ * <p> Remote cache servers can be clustered. If the cache used by this remote cache is configured
+ * to use a remote cache of type cluster, the two remote caches will communicate with each other.
+ * Remote and put requests can be sent from one remote to another. If they are configured to
+ * broadcast such event to their client, then remove an puts can be sent to all locals in the
+ * cluster. <p> Get requests are made between clustered servers if AllowClusterGet is true. You can
+ * setup several clients to use one remote server and several to use another. The get locad will be
+ * distributed between the two servers. Since caches are usually high get and low put, this should
+ * allow you to scale.
*/
class RemoteCacheServer
extends UnicastRemoteObject
implements IRemoteCacheService, IRemoteCacheObserver, IRemoteCacheServiceAdmin, Unreferenced
{
- /** For serialization. Don't change.*/
+ /** For serialization. Don't change. */
private static final long serialVersionUID = -8072345435941473116L;
/** log instance */
@@ -90,6 +83,9 @@
/** relates listener id with a type */
private final Hashtable idTypeMap = new Hashtable();
+ /** relates listener id with an ip address */
+ private final Hashtable idIPMap = new Hashtable();
+
private int[] listenerId = new int[1];
/** Configuration settings. */
@@ -98,9 +94,12 @@
/** The interval at which we will log updates. */
private int logInterval = 100;
+ /** An optional event logger */
+ private ICacheEventLogger cacheEventLogger;
+
/**
- * Constructor for the RemoteCacheServer object. Thiks initializes the
- * server with the values from the config file.
+ * Constructor for the RemoteCacheServer object. Thiks initializes the server with the values
+ * from the config file.
* <p>
* @param rcsa
* @throws RemoteException
@@ -135,8 +134,7 @@
/**
* Subclass can override this method to create the specific cache manager.
* <p>
- * @param prop
- * The anem of the configuration file.
+ * @param prop The name of the configuration file.
* @return The cache hub configured with this configuration file.
*/
private CompositeCacheManager createCacheManager( String prop )
@@ -155,62 +153,10 @@
}
/**
- * Returns the cache listener for the specified cache. Creates the cache and
- * the cache descriptor if they do not already exist.
- * <p>
- * @param cacheName
- * @return The cacheListeners value
- */
- protected CacheListeners getCacheListeners( String cacheName )
- {
- CacheListeners cacheListeners = (CacheListeners) cacheListenersMap.get( cacheName );
- synchronized ( cacheListenersMap )
- {
- if ( cacheListeners == null )
- {
- cacheListeners = (CacheListeners) cacheListenersMap.get( cacheName );
- if ( cacheListeners == null )
- {
- cacheListeners = new CacheListeners( cacheManager.getCache( cacheName ) );
- cacheListenersMap.put( cacheName, cacheListeners );
- }
- }
- }
- return cacheListeners;
- }
-
- /**
- * Gets the clusterListeners attribute of the RemoteCacheServer object.
- * <p>
- * @todo may be able to remove this
- *
- * @param cacheName
- * @return The clusterListeners value
- */
- protected CacheListeners getClusterListeners( String cacheName )
- {
- CacheListeners cacheListeners = (CacheListeners) clusterListenersMap.get( cacheName );
- synchronized ( clusterListenersMap )
- {
- if ( cacheListeners == null )
- {
- cacheListeners = (CacheListeners) clusterListenersMap.get( cacheName );
- if ( cacheListeners == null )
- {
- cacheListeners = new CacheListeners( cacheManager.getCache( cacheName ) );
- clusterListenersMap.put( cacheName, cacheListeners );
- }
- }
- }
- return cacheListeners;
- }
-
- /**
- * Puts a cache bean to the remote cache and notifies all listeners which
- * <br>
+ * Puts a cache bean to the remote cache and notifies all listeners which <br>
* <ol>
- * <li>have a different listener id than the originating host;
- * <li>are currently subscribed to the related cache.
+ * <li>have a different listener id than the originating host; <li>are currently subscribed to
+ * the related cache.
* </ol>
* <p>
* @param item
@@ -223,8 +169,8 @@
}
/**
- * @param item
- * @throws IOException
+ * @param item
+ * @throws IOException
*/
public void update( ICacheElement item )
throws IOException
@@ -233,29 +179,7 @@
}
/**
- * An update can come from either a local cache's remote auxiliary, or it
- * can come from a remote server. A remote server is considered a a source
- * of type cluster.
- * <p>
- * If the update came from a cluster, then we should tell the cache manager
- * that this was a remote put. This way, any lateral and remote auxiliaries
- * configured for the region will not be updated. This is basically how a
- * remote listener works when plugged into a local cache.
- * <p>
- * If the cluster is configured to keep local cluster consistency, then all
- * listeners will be updated. This allows cluster server A to update cluster
- * server B and then B to update its clients if it is told to keep local
- * cluster consistency. Otherwise, server A will update server B and B will
- * not tell its clients. If you cluster using lateral caches for instance,
- * this is how it will work. Updates to a cluster node, will never get to
- * the leavess. The remote cluster, with local cluster consistency, allows
- * you to update leaves. This basically allows you to have a failover remote
- * server.
- * <p>
- * Since currently a cluster will not try to get from other cluster servers,
- * you can scale a bit with a cluster configuration. Puts and removes will
- * be broadcasted to all clients, but the get load on a remote server can be
- * reduced.
+ * The internal processing is wrapped in event logging calls.
* <p>
* @param item
* @param requesterId
@@ -264,27 +188,51 @@
public void update( ICacheElement item, long requesterId )
throws IOException
{
- long start = 0;
- if ( timing )
+ logEventStart( item, requesterId, ICacheEventLogger.UPDATE_EVENT );
+ try
{
- start = System.currentTimeMillis();
+ processUpdate( item, requesterId );
}
-
- if ( log.isInfoEnabled() )
+ finally
{
- // not thread safe, but it doesn't have to be accurate
- puts++;
- if ( puts % logInterval == 0 )
- {
- log.info( "puts = " + puts );
- }
+ logEventFinish( item, requesterId, ICacheEventLogger.UPDATE_EVENT );
}
+ }
- if ( log.isDebugEnabled() )
+ /**
+ * An update can come from either a local cache's remote auxiliary, or it can come from a remote
+ * server. A remote server is considered a a source of type cluster.
+ * <p>
+ * If the update came from a cluster, then we should tell the cache manager that this was a
+ * remote put. This way, any lateral and remote auxiliaries configured for the region will not
+ * be updated. This is basically how a remote listener works when plugged into a local cache.
+ * <p>
+ * If the cluster is configured to keep local cluster consistency, then all listeners will be
+ * updated. This allows cluster server A to update cluster server B and then B to update its
+ * clients if it is told to keep local cluster consistency. Otherwise, server A will update
+ * server B and B will not tell its clients. If you cluster using lateral caches for instance,
+ * this is how it will work. Updates to a cluster node, will never get to the leaves. The remote
+ * cluster, with local cluster consistency, allows you to update leaves. This basically allows
+ * you to have a failover remote server.
+ * <p>
+ * Since currently a cluster will not try to get from other cluster servers, you can scale a bit
+ * with a cluster configuration. Puts and removes will be broadcasted to all clients, but the
+ * get load on a remote server can be reduced.
+ * <p>
+ * @param item
+ * @param requesterId
+ * @throws IOException
+ */
+ private void processUpdate( ICacheElement item, long requesterId )
+ {
+ long start = 0;
+ if ( timing )
{
- log.debug( "In update, put [" + item.getKey() + "] in [" + item.getCacheName() + "]" );
+ start = System.currentTimeMillis();
}
+ logUpdateInfo( item );
+
try
{
CacheListeners cacheDesc = getCacheListeners( item.getCacheName() );
@@ -380,6 +328,12 @@
}
catch ( Exception e )
{
+ if ( cacheEventLogger != null )
+ {
+ cacheEventLogger.logError( "RemoteCacheServer", item.getCacheName(), ICacheEventLogger.UPDATE_EVENT, e
+ .getMessage(), item );
+ }
+
log.error( "Trouble in Update. requesterId [" + requesterId + "]", e );
}
@@ -392,66 +346,34 @@
log.debug( "put took " + String.valueOf( end - start ) + " ms." );
}
}
-
- return;
}
/**
- * Gets the eventQList attribute of the RemoteCacheServer object. This
- * returns the event queues stored in the cacheListeners object for a
- * particuylar region, if the queue is not for this requester.
- * <p>
- * Basically, this makes sure that a request from a particular local cache,
- * identified by its listener id, does not result in a call to that same
- * listener.
+ * Log some details.
* <p>
- * @param cacheListeners
- * @param requesterId
- * @return The eventQList value
+ * @param item
*/
- private ICacheEventQueue[] getEventQList( CacheListeners cacheListeners, long requesterId )
+ private void logUpdateInfo( ICacheElement item )
{
- ICacheEventQueue[] list = null;
- synchronized ( cacheListeners.eventQMap )
- {
- list = (ICacheEventQueue[]) cacheListeners.eventQMap.values().toArray( new ICacheEventQueue[0] );
- }
- int count = 0;
- // Set those not qualified to null; Count those qualified.
- for ( int i = 0; i < list.length; i++ )
+ if ( log.isInfoEnabled() )
{
- ICacheEventQueue q = list[i];
- if ( q.isWorking() && q.getListenerId() != requesterId )
- {
- count++;
- }
- else
+ // not thread safe, but it doesn't have to be accurate
+ puts++;
+ if ( puts % logInterval == 0 )
{
- list[i] = null;
+ log.info( "puts = " + puts );
}
}
- if ( count == list.length )
- {
- // All qualified.
- return list;
- }
- // Returns only the qualified.
- ICacheEventQueue[] qq = new ICacheEventQueue[count];
- count = 0;
- for ( int i = 0; i < list.length; i++ )
+ if ( log.isDebugEnabled() )
{
- if ( list[i] != null )
- {
- qq[count++] = list[i];
- }
+ log.debug( "In update, put [" + item.getKey() + "] in [" + item.getCacheName() + "]" );
}
- return qq;
}
/**
- * Returns a cache value from the specified remote cache; or null if the
- * cache or key does not exist.
+ * Returns a cache value from the specified remote cache; or null if the cache or key does not
+ * exist.
* <p>
* @param cacheName
* @param key
@@ -465,11 +387,11 @@
}
/**
- * Returns a cache bean from the specified cache; or null if the key does
- * not exist.
+ * Returns a cache bean from the specified cache; or null if the key does not exist.
+ * <p>
+ * Adding the requestor id, allows the cache to determine the source of the get.
* <p>
- * Adding the requestor id, allows the cache to determine the sournce of the
- * get.
+ * The internal processing is wrapped in event logging calls.
* <p>
* @param cacheName
* @param key
@@ -480,6 +402,32 @@
public ICacheElement get( String cacheName, Serializable key, long requesterId )
throws IOException
{
+ ICacheElement element = null;
+ logEventStart( cacheName, key, requesterId, ICacheEventLogger.GET_EVENT );
+ try
+ {
+ element = processGet( cacheName, key, requesterId );
+ }
+ finally
+ {
+ logEventFinish( element, requesterId, ICacheEventLogger.GET_EVENT );
+ }
+ return element;
+ }
+
+ /**
+ * Returns a cache bean from the specified cache; or null if the key does not exist.
+ * <p>
+ * Adding the requestor id, allows the cache to determine the source of the get.
+ * <p>
+ * @param cacheName
+ * @param key
+ * @param requesterId
+ * @return ICacheElement
+ * @throws IOException
+ */
+ private ICacheElement processGet( String cacheName, Serializable key, long requesterId )
+ {
Integer remoteTypeL = (Integer) idTypeMap.get( new Long( requesterId ) );
if ( log.isDebugEnabled() )
@@ -507,63 +455,84 @@
catch ( Exception e )
{
log.error( "Problem getting listeners.", e );
- }
- if ( cacheDesc == null )
- {
- return null;
+ if ( cacheEventLogger != null )
+ {
+ cacheEventLogger.logError( "RemoteCacheServer", cacheName, ICacheEventLogger.GET_EVENT, e.getMessage(),
+ key );
+ }
}
- CompositeCache c = (CompositeCache) cacheDesc.cache;
ICacheElement element = null;
- // If we have a get come in from a client and we don't have the item
- // locally, we will allow the cache to look in other non local sources,
- // such as a remote cache or a lateral.
- //
- // Since remote servers never get from clients and clients never go
- // remote from a remote call, this
- // will not result in any loops.
- //
- // This is the only instance I can think of where we allow a remote get
- // from a remote call. The purpose is to allow remote cache servers to
- // talk to each other. If one goes down, you want it to be able to get
- // data from those that were up when the failed server comes back o
- // line.
+ element = getFromCacheListeners( key, fromCluster, cacheDesc, element );
+ return element;
+ }
- if ( !fromCluster && this.rcsa.getAllowClusterGet() )
+ /**
+ * Gets the item from the associated cache listeners.
+ * <p>
+ * @param key
+ * @param fromCluster
+ * @param cacheDesc
+ * @param element
+ * @return
+ */
+ private ICacheElement getFromCacheListeners( Serializable key, boolean fromCluster, CacheListeners cacheDesc,
+ ICacheElement element )
+ {
+ if ( cacheDesc != null )
{
- if ( log.isDebugEnabled() )
+ CompositeCache c = (CompositeCache) cacheDesc.cache;
+
+ // If we have a get come in from a client and we don't have the item
+ // locally, we will allow the cache to look in other non local sources,
+ // such as a remote cache or a lateral.
+ //
+ // Since remote servers never get from clients and clients never go
+ // remote from a remote call, this
+ // will not result in any loops.
+ //
+ // This is the only instance I can think of where we allow a remote get
+ // from a remote call. The purpose is to allow remote cache servers to
+ // talk to each other. If one goes down, you want it to be able to get
+ // data from those that were up when the failed server comes back o
+ // line.
+
+ if ( !fromCluster && this.rcsa.getAllowClusterGet() )
{
- log.debug( "NonLocalGet. fromCluster [" + fromCluster + "] AllowClusterGet ["
- + this.rcsa.getAllowClusterGet() + "]" );
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "NonLocalGet. fromCluster [" + fromCluster + "] AllowClusterGet ["
+ + this.rcsa.getAllowClusterGet() + "]" );
+ }
+ element = c.get( key );
}
- element = c.get( key );
- }
- else
- {
- // Gets from cluster type remote will end up here.
- // Gets from all clients will end up here if allow cluster get is
- // false.
-
- if ( log.isDebugEnabled() )
+ else
{
- log.debug( "LocalGet. fromCluster [" + fromCluster + "] AllowClusterGet ["
- + this.rcsa.getAllowClusterGet() + "]" );
+ // Gets from cluster type remote will end up here.
+ // Gets from all clients will end up here if allow cluster get is
+ // false.
+
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "LocalGet. fromCluster [" + fromCluster + "] AllowClusterGet ["
+ + this.rcsa.getAllowClusterGet() + "]" );
+ }
+ element = c.localGet( key );
}
- element = c.localGet( key );
}
-
return element;
}
/**
* Gets multiple items from the cache based on the given set of keys.
* <p>
- * @param cacheName
+ * @param cacheName
* @param keys
- * @return a map of Serializable key to ICacheElement element, or an empty map if there is no data in cache for any of these keys
- * @throws IOException
+ * @return a map of Serializable key to ICacheElement element, or an empty map if there is no
+ * data in cache for any of these keys
+ * @throws IOException
*/
public Map getMultiple( String cacheName, Set keys )
throws IOException
@@ -574,15 +543,43 @@
/**
* Gets multiple items from the cache based on the given set of keys.
* <p>
- * @param cacheName
+ * The internal processing is wrapped in event logging calls.
+ * <p>
+ * @param cacheName
* @param keys
- * @param requesterId
- * @return a map of Serializable key to ICacheElement element, or an empty map if there is no data in cache for any of these keys
- * @throws IOException
+ * @param requesterId
+ * @return a map of Serializable key to ICacheElement element, or an empty map if there is no
+ * data in cache for any of these keys
+ * @throws IOException
*/
public Map getMultiple( String cacheName, Set keys, long requesterId )
throws IOException
{
+ logEventStart( cacheName, (Serializable) keys, requesterId, ICacheEventLogger.GETMULTIPLE_EVENT );
+ try
+ {
+ return processGetMultiple( cacheName, keys, requesterId );
+ }
+ finally
+ {
+ logEventEnd( cacheName, (Serializable) keys, requesterId, ICacheEventLogger.GETMULTIPLE_EVENT );
+ }
+ }
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @param cacheName
+ * @param keys
+ * @param requesterId
+ * @return a map of Serializable key to ICacheElement element, or an empty map if there is no
+ * data in cache for any of these keys
+ * @throws IOException
+ */
+ private Map processGetMultiple( String cacheName, Set keys, long requesterId )
+ {
+ Map elements = null;
+
Integer remoteTypeL = (Integer) idTypeMap.get( new Long( requesterId ) );
if ( log.isDebugEnabled() )
@@ -612,53 +609,64 @@
log.error( "Problem getting listeners.", e );
}
- if ( cacheDesc == null )
- {
- return null;
- }
- CompositeCache c = (CompositeCache) cacheDesc.cache;
+ elements = getMultipleFromCacheListeners( keys, elements, fromCluster, cacheDesc );
+ return elements;
+ }
- Map elements = null;
+ /**
+ * Gets the items from the associated cache listeners.
+ * <p>
+ * @param keys
+ * @param elements
+ * @param fromCluster
+ * @param cacheDesc
+ * @return
+ */
+ private Map getMultipleFromCacheListeners( Set keys, Map elements, boolean fromCluster, CacheListeners cacheDesc )
+ {
+ if ( cacheDesc != null )
+ {
+ CompositeCache c = (CompositeCache) cacheDesc.cache;
- // If we have a getMultiple come in from a client and we don't have the item
- // locally, we will allow the cache to look in other non local sources,
- // such as a remote cache or a lateral.
- //
- // Since remote servers never get from clients and clients never go
- // remote from a remote call, this
- // will not result in any loops.
- //
- // This is the only instance I can think of where we allow a remote get
- // from a remote call. The purpose is to allow remote cache servers to
- // talk to each other. If one goes down, you want it to be able to get
- // data from those that were up when the failed server comes back o
- // line.
+ // If we have a getMultiple come in from a client and we don't have the item
+ // locally, we will allow the cache to look in other non local sources,
+ // such as a remote cache or a lateral.
+ //
+ // Since remote servers never get from clients and clients never go
+ // remote from a remote call, this
+ // will not result in any loops.
+ //
+ // This is the only instance I can think of where we allow a remote get
+ // from a remote call. The purpose is to allow remote cache servers to
+ // talk to each other. If one goes down, you want it to be able to get
+ // data from those that were up when the failed server comes back o
+ // line.
- if ( !fromCluster && this.rcsa.getAllowClusterGet() )
- {
- if ( log.isDebugEnabled() )
+ if ( !fromCluster && this.rcsa.getAllowClusterGet() )
{
- log.debug( "NonLocalGetMultiple. fromCluster [" + fromCluster + "] AllowClusterGet ["
- + this.rcsa.getAllowClusterGet() + "]" );
- }
-
- elements = c.getMultiple( keys );
- }
- else
- {
- // Gets from cluster type remote will end up here.
- // Gets from all clients will end up here if allow cluster get is
- // false.
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "NonLocalGetMultiple. fromCluster [" + fromCluster + "] AllowClusterGet ["
+ + this.rcsa.getAllowClusterGet() + "]" );
+ }
- if ( log.isDebugEnabled() )
+ elements = c.getMultiple( keys );
+ }
+ else
{
- log.debug( "LocalGetMultiple. fromCluster [" + fromCluster + "] AllowClusterGet ["
- + this.rcsa.getAllowClusterGet() + "]" );
+ // Gets from cluster type remote will end up here.
+ // Gets from all clients will end up here if allow cluster get is
+ // false.
+
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "LocalGetMultiple. fromCluster [" + fromCluster + "] AllowClusterGet ["
+ + this.rcsa.getAllowClusterGet() + "]" );
+ }
+
+ elements = c.localGetMultiple( keys );
}
-
- elements = c.localGetMultiple( keys );
}
-
return elements;
}
@@ -685,14 +693,13 @@
{
return Collections.EMPTY_SET;
}
-
+
CompositeCache c = (CompositeCache) cacheDesc.cache;
return c.getGroupKeys( group );
}
/**
- * Removes the given key from the specified remote cache. Defaults the
- * listener id to 0.
+ * Removes the given key from the specified remote cache. Defaults the listener id to 0.
* <p>
* @param cacheName
* @param key
@@ -705,8 +712,9 @@
}
/**
- * Remove the key from the cache region and don't tell the source listener
- * about it.
+ * Remove the key from the cache region and don't tell the source listener about it.
+ * <p>
+ * The internal processing is wrapped in event logging calls.
* <p>
* @param cacheName
* @param key
@@ -716,10 +724,35 @@
public void remove( String cacheName, Serializable key, long requesterId )
throws IOException
{
+ logEventStart( cacheName, key, requesterId, ICacheEventLogger.REMOVE_EVENT );
+ try
+ {
+ processRemove( cacheName, key, requesterId );
+ }
+ finally
+ {
+ logEventEnd( cacheName, key, requesterId, ICacheEventLogger.REMOVE_EVENT );
+ }
+
+ return;
+ }
+
+ /**
+ * Remove the key from the cache region and don't tell the source listener about it.
+ * <p>
+ * @param cacheName
+ * @param key
+ * @param requesterId
+ * @throws IOException
+ */
+ private void processRemove( String cacheName, Serializable key, long requesterId )
+ throws IOException
+ {
if ( log.isDebugEnabled() )
{
log.debug( "remove [" + key + "] from cache [" + cacheName + "]" );
}
+
CacheListeners cacheDesc = (CacheListeners) cacheListenersMap.get( cacheName );
Integer remoteTypeL = (Integer) idTypeMap.get( new Long( requesterId ) );
@@ -776,11 +809,10 @@
}
}
}
- return;
}
/**
- * Remove all keys from the sepcified remote cache.
+ * Remove all keys from the specified remote cache.
* <p>
* @param cacheName
* @throws IOException
@@ -794,6 +826,8 @@
/**
* Remove all keys from the specified remote cache.
* <p>
+ * The internal processing is wrapped in event logging calls.
+ * <p>
* @param cacheName
* @param requesterId
* @throws IOException
@@ -801,6 +835,28 @@
public void removeAll( String cacheName, long requesterId )
throws IOException
{
+ logEventStart( cacheName, "all", requesterId, ICacheEventLogger.REMOVEALL_EVENT );
+ try
+ {
+ processRemoveAll( cacheName, requesterId );
+ }
+ finally
+ {
+ logEventEnd( cacheName, "all", requesterId, ICacheEventLogger.REMOVEALL_EVENT );
+ }
+ return;
+ }
+
+ /**
+ * Remove all keys from the specified remote cache.
+ * <p>
+ * @param cacheName
+ * @param requesterId
+ * @throws IOException
+ */
+ private void processRemoveAll( String cacheName, long requesterId )
+ throws IOException
+ {
CacheListeners cacheDesc = (CacheListeners) cacheListenersMap.get( cacheName );
Integer remoteTypeL = (Integer) idTypeMap.get( new Long( requesterId ) );
@@ -848,7 +904,6 @@
}
}
}
- return;
}
/**
@@ -883,28 +938,36 @@
public void dispose( String cacheName, long requesterId )
throws IOException
{
- if ( log.isInfoEnabled() )
+ logEventStart( cacheName, "none", requesterId, ICacheEventLogger.DISPOSE_EVENT );
+ try
{
- log.info( "Dispose request received from listener [" + requesterId + "]" );
- }
+ if ( log.isInfoEnabled() )
+ {
+ log.info( "Dispose request received from listener [" + requesterId + "]" );
+ }
- CacheListeners cacheDesc = (CacheListeners) cacheListenersMap.get( cacheName );
+ CacheListeners cacheDesc = (CacheListeners) cacheListenersMap.get( cacheName );
- // this is dangerous
- if ( cacheDesc != null )
- {
- // best attempt to achieve ordered free-cache-op and notification.
- synchronized ( cacheDesc )
+ // this is dangerous
+ if ( cacheDesc != null )
{
- ICacheEventQueue[] qlist = getEventQList( cacheDesc, requesterId );
-
- for ( int i = 0; i < qlist.length; i++ )
+ // best attempt to achieve ordered free-cache-op and notification.
+ synchronized ( cacheDesc )
{
- qlist[i].addDisposeEvent();
+ ICacheEventQueue[] qlist = getEventQList( cacheDesc, requesterId );
+
+ for ( int i = 0; i < qlist.length; i++ )
+ {
+ qlist[i].addDisposeEvent();
+ }
+ cacheManager.freeCache( cacheName );
}
- cacheManager.freeCache( cacheName );
}
}
+ finally
+ {
+ logEventEnd( cacheName, "none", requesterId, ICacheEventLogger.DISPOSE_EVENT );
+ }
return;
}
@@ -934,6 +997,108 @@
}
/**
+ * Returns the cache listener for the specified cache. Creates the cache and the cache
+ * descriptor if they do not already exist.
+ * <p>
+ * @param cacheName
+ * @return The cacheListeners value
+ */
+ protected CacheListeners getCacheListeners( String cacheName )
+ {
+ CacheListeners cacheListeners = (CacheListeners) cacheListenersMap.get( cacheName );
+ synchronized ( cacheListenersMap )
+ {
+ if ( cacheListeners == null )
+ {
+ cacheListeners = (CacheListeners) cacheListenersMap.get( cacheName );
+ if ( cacheListeners == null )
+ {
+ cacheListeners = new CacheListeners( cacheManager.getCache( cacheName ) );
+ cacheListenersMap.put( cacheName, cacheListeners );
+ }
+ }
+ }
+ return cacheListeners;
+ }
+
+ /**
+ * Gets the clusterListeners attribute of the RemoteCacheServer object.
+ * <p>
+ * TODO may be able to remove this
+ * @param cacheName
+ * @return The clusterListeners value
+ */
+ protected CacheListeners getClusterListeners( String cacheName )
+ {
+ CacheListeners cacheListeners = (CacheListeners) clusterListenersMap.get( cacheName );
+ synchronized ( clusterListenersMap )
+ {
+ if ( cacheListeners == null )
+ {
+ cacheListeners = (CacheListeners) clusterListenersMap.get( cacheName );
+ if ( cacheListeners == null )
+ {
+ cacheListeners = new CacheListeners( cacheManager.getCache( cacheName ) );
+ clusterListenersMap.put( cacheName, cacheListeners );
+ }
+ }
+ }
+ return cacheListeners;
+ }
+
+ /**
+ * Gets the eventQList attribute of the RemoteCacheServer object. This returns the event queues
+ * stored in the cacheListeners object for a particular region, if the queue is not for this
+ * requester.
+ * <p>
+ * Basically, this makes sure that a request from a particular local cache, identified by its
+ * listener id, does not result in a call to that same listener.
+ * <p>
+ * @param cacheListeners
+ * @param requesterId
+ * @return The eventQList value
+ */
+ private ICacheEventQueue[] getEventQList( CacheListeners cacheListeners, long requesterId )
+ {
+ ICacheEventQueue[] list = null;
+ synchronized ( cacheListeners.eventQMap )
+ {
+ list = (ICacheEventQueue[]) cacheListeners.eventQMap.values().toArray( new ICacheEventQueue[0] );
+ }
+ int count = 0;
+ // Set those not qualified to null; Count those qualified.
+ for ( int i = 0; i < list.length; i++ )
+ {
+ ICacheEventQueue q = list[i];
+ if ( q.isWorking() && q.getListenerId() != requesterId )
+ {
+ count++;
+ }
+ else
+ {
+ list[i] = null;
+ }
+ }
+ if ( count == list.length )
+ {
+ // All qualified.
+ return list;
+ }
+
+ // Returns only the qualified.
+ ICacheEventQueue[] qq = new ICacheEventQueue[count];
+ count = 0;
+ for ( int i = 0; i < list.length; i++ )
+ {
+ if ( list[i] != null )
+ {
+ qq[count++] = list[i];
+ }
+ }
+ return qq;
+ }
+
+ /**
* Removes dead event queues. Should clean out deregistered listeners.
* <p>
* @param eventQMap
@@ -949,8 +1114,8 @@
// this does not care if the q is alive (i.e. if
// there are active threads; it cares if the queue
- // is working -- if it has not encoutnered errors
- // above the failure threshhold
+ // is working -- if it has not encountered errors
+ // above the failure threshold
if ( !q.isWorking() )
{
itr.remove();
@@ -963,14 +1128,12 @@
/**
* Subscribes to the specified remote cache.
* <p>
- * If the client id is 0, then the remote cache server will increment it's
- * local count and assign an id to the client.
+ * If the client id is 0, then the remote cache server will increment it's local count and
+ * assign an id to the client.
* <p>
- * @param cacheName
- * the specified remote cache.
- * @param listener
- * object to notify for cache changes. must be synchronized since
- * there are remote calls involved.
+ * @param cacheName the specified remote cache.
+ * @param listener object to notify for cache changes. must be synchronized since there are
+ * remote calls involved.
* @throws IOException
*/
public void addCacheListener( String cacheName, ICacheListener listener )
@@ -1007,7 +1170,7 @@
try
{
id = listener.getListenerId();
- // clients problably shouldn't do this.
+ // clients probably shouldn't do this.
if ( id == 0 )
{
// must start at one so the next gets recognized
@@ -1040,10 +1203,21 @@
// relate the type to an id
this.idTypeMap.put( new Long( id ), new Integer( remoteType ) );
+ if ( listenerAddress != null )
+ {
+ this.idIPMap.put( new Long( id ), listenerAddress );
+ }
}
catch ( IOException ioe )
{
- log.error( "Problem setting listener id, listenerAddress [" + listenerAddress + "]", ioe );
+ String message = "Problem setting listener id, listenerAddress [" + listenerAddress + "]";
+ log.error( message, ioe );
+
+ if ( cacheEventLogger != null )
+ {
+ cacheEventLogger.logError( "RemoteCacheServer", "addCacheListener", message + " - "
+ + ioe.getMessage() );
+ }
}
CacheEventQueueFactory fact = new CacheEventQueueFactory();
@@ -1062,8 +1236,7 @@
/**
* Subscribes to all remote caches.
* <p>
- * @param listener
- * The feature to be added to the CacheListener attribute
+ * @param listener The feature to be added to the CacheListener attribute
* @throws IOException
*/
public void addCacheListener( ICacheListener listener )
@@ -1082,12 +1255,12 @@
}
/**
- * Unsubscribe this listener from this region. If the listener is
- * registered, it will be removed from the event queue map list.
+ * Unsubscribe this listener from this region. If the listener is registered, it will be removed
+ * from the event queue map list.
* <p>
* @param cacheName
* @param listener
- * @throws IOException
+ * @throws IOException
*/
public void removeCacheListener( String cacheName, ICacheListener listener )
throws IOException
@@ -1096,8 +1269,8 @@
}
/**
- * Unsubscribe this listener from this region. If the listener is
- * registered, it will be removed from the event queue map list.
+ * Unsubscribe this listener from this region. If the listener is registered, it will be removed
+ * from the event queue map list.
* <p>
* @param cacheName
* @param listenerId
@@ -1148,6 +1321,10 @@
}
}
+ // cleanup
+ idTypeMap.remove( new Long( listenerId ) );
+ idIPMap.remove( new Long( listenerId ) );
+
if ( log.isInfoEnabled() )
{
log.info( "After removing listener [" + listenerId + "] cache region " + cacheName + "'s listener size ["
@@ -1189,7 +1366,8 @@
}
/**
- * Shuts down a server at a particular host and port. Then it calls shutdown on the cache itself.
+ * Shuts down a server at a particular host and port. Then it calls shutdown on the cache
+ * itself.
* <p>
* @param host
* @param port
@@ -1207,9 +1385,8 @@
}
/**
- * Called by the RMI runtime sometime after the runtime determines that the
- * reference list, the list of clients referencing the remote object,
- * becomes empty.
+ * Called by the RMI runtime sometime after the runtime determines that the reference list, the
+ * list of clients referencing the remote object, becomes empty.
*/
// TODO: test out the DGC.
public void unreferenced()
@@ -1223,8 +1400,7 @@
/**
* Returns the next generated listener id [0,255].
* <p>
- * @return the listener id of a client. This should be unique for this
- * server.
+ * @return the listener id of a client. This should be unique for this server.
*/
private long nextListenerId()
{
@@ -1263,4 +1439,91 @@
{
return cacheManager.getStats();
}
+
+ /**
+ * Logs an event if an event logger is configured.
+ * <p>
+ * @param item
+ * @param requesterId
+ */
+ private void logEventStart( ICacheElement item, long requesterId, String eventName )
+ {
+ if ( cacheEventLogger != null )
+ {
+ String ipAddress = getIPAddressForRequesterId( requesterId );
+ cacheEventLogger.logStartICacheEvent( "RemoteCacheServer", item.getCacheName(), eventName, ipAddress, item );
+ }
+ }
+
+ /**
+ * Logs an event if an event logger is configured.
+ * <p>
+ * @param cacheName
+ * @param key
+ * @param requesterId
+ */
+ private void logEventStart( String cacheName, Serializable key, long requesterId, String eventName )
+ {
+ if ( cacheEventLogger != null )
+ {
+ String ipAddress = getIPAddressForRequesterId( requesterId );
+ cacheEventLogger.logStartICacheEvent( "RemoteCacheServer", cacheName, eventName, ipAddress, key );
+ }
+ }
+
+ /**
+ * Logs an event if an event logger is configured.
+ * <p>
+ * @param item
+ * @param requesterId
+ */
+ private void logEventFinish( ICacheElement item, long requesterId, String eventName )
+ {
+ if ( cacheEventLogger != null )
+ {
+ String ipAddress = getIPAddressForRequesterId( requesterId );
+ cacheEventLogger.logEndICacheEvent( "RemoteCacheServer", item.getCacheName(), eventName, ipAddress, item );
+ }
+ }
+
+ /**
+ * Logs an event if an event logger is configured.
+ * <p>
+ * @param cacheName
+ * @param key
+ * @param requesterId
+ */
+ private void logEventEnd( String cacheName, Serializable key, long requesterId, String eventName )
+ {
+ if ( cacheEventLogger != null )
+ {
+ String ipAddress = getIPAddressForRequesterId( requesterId );
+ cacheEventLogger.logEndICacheEvent( "RemoteCacheServer", cacheName, eventName,
+ ipAddress, key );
+ }
+ }
+
+ /**
+ * Ip address for the client, if one is stored.
+ * <p>
+ * Protected for testing.
+ * <p>
+ * @param requesterId
+ * @return String
+ */
+ protected String getIPAddressForRequesterId( long requesterId )
+ {
+ String ipAddress = (String)idIPMap.get( new Long( requesterId ) );
+ return ipAddress;
+ }
+
+ /**
+ * Allows it to be injected.
+ * <p>
+ * @param cacheEventLogger
+ */
+ public void setCacheEventLogger( ICacheEventLogger cacheEventLogger )
+ {
+ this.cacheEventLogger = cacheEventLogger;
+ }
}
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerAttributes.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerAttributes.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerAttributes.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerAttributes.java Wed Aug 13 15:14:46 2008
@@ -1,22 +1,18 @@
package org.apache.jcs.auxiliary.remote.server;
/*
- * 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.
+ * 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.jcs.auxiliary.AbstractAuxiliaryCacheAttributes;
@@ -69,6 +65,7 @@
/**
* Gets the remoteTypeName attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The remoteTypeName value
*/
public String getRemoteTypeName()
@@ -87,6 +84,7 @@
/**
* Sets the remoteTypeName attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param s The new remoteTypeName value
*/
public void setRemoteTypeName( String s )
@@ -104,6 +102,7 @@
/**
* Gets the remoteType attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The remoteType value
*/
public int getRemoteType()
@@ -114,6 +113,7 @@
/**
* Sets the remoteType attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param p The new remoteType value
*/
public void setRemoteType( int p )
@@ -124,6 +124,7 @@
/**
* clones
* <p>
+ *
* @return AuxiliaryCacheAttributes clone
*/
public AuxiliaryCacheAttributes copy()
@@ -142,6 +143,7 @@
/**
* Gets the remoteServiceName attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The remoteServiceName value
*/
public String getRemoteServiceName()
@@ -152,6 +154,7 @@
/**
* Sets the remoteServiceName attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param s The new remoteServiceName value
*/
public void setRemoteServiceName( String s )
@@ -162,6 +165,7 @@
/**
* Gets the remoteHost attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The remoteHost value
*/
public String getRemoteHost()
@@ -172,6 +176,7 @@
/**
* Sets the remoteHost attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param s The new remoteHost value
*/
public void setRemoteHost( String s )
@@ -182,6 +187,7 @@
/**
* Gets the remotePort attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The remotePort value
*/
public int getRemotePort()
@@ -192,6 +198,7 @@
/**
* Sets the remotePort attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param p The new remotePort value
*/
public void setRemotePort( int p )
@@ -202,6 +209,7 @@
/**
* Gets the clusterServers attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The clusterServers value
*/
public String getClusterServers()
@@ -212,6 +220,7 @@
/**
* Sets the clusterServers attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param s The new clusterServers value
*/
public void setClusterServers( String s )
@@ -222,6 +231,7 @@
/**
* Gets the localPort attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The localPort value
*/
public int getServicePort()
@@ -232,6 +242,7 @@
/**
* Sets the localPort attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param p The new localPort value
*/
public void setServicePort( int p )
@@ -242,6 +253,7 @@
/**
* Gets the removeUponRemotePut attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The removeUponRemotePut value
*/
public boolean getRemoveUponRemotePut()
@@ -252,6 +264,7 @@
/**
* Sets the removeUponRemotePut attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param r The new removeUponRemotePut value
*/
public void setRemoveUponRemotePut( boolean r )
@@ -262,6 +275,7 @@
/**
* Gets the getOnly attribute of the RemoteCacheAttributes object
* <p>
+ *
* @return The getOnly value
*/
public boolean getGetOnly()
@@ -272,6 +286,7 @@
/**
* Sets the getOnly attribute of the RemoteCacheAttributes object
* <p>
+ *
* @param r The new getOnly value
*/
public void setGetOnly( boolean r )
@@ -280,8 +295,9 @@
}
/**
- * Should cluster updates be propogated to the locals
+ * Should cluster updates be propagated to the locals
* <p>
+ *
* @return The localClusterConsistency value
*/
public boolean getLocalClusterConsistency()
@@ -290,8 +306,9 @@
}
/**
- * Should cluster updates be propogated to the locals
+ * Should cluster updates be propagated to the locals
* <p>
+ *
* @param r The new localClusterConsistency value
*/
public void setLocalClusterConsistency( boolean r )
@@ -302,6 +319,7 @@
/**
* Should gets from non-cluster clients be allowed to get from other remote auxiliaries.
* <p>
+ *
* @return The localClusterConsistency value
*/
public boolean getAllowClusterGet()
@@ -312,6 +330,7 @@
/**
* Should we try to get from other cluster servers if we don't find the items locally.
* <p>
+ *
* @param r The new localClusterConsistency value
*/
public void setAllowClusterGet( boolean r )
@@ -322,6 +341,7 @@
/**
* Gets the ConfigFileName attribute of the IRemoteCacheAttributes object
* <p>
+ *
* @return The clusterServers value
*/
public String getConfigFileName()
@@ -332,6 +352,7 @@
/**
* Sets the ConfigFileName attribute of the IRemoteCacheAttributes object
* <p>
+ *
* @param s The new clusterServers value
*/
public void setConfigFileName( String s )
@@ -339,9 +360,8 @@
configFileName = s;
}
- /*
- * (non-Javadoc)
- * @see java.lang.Object#toString()
+ /**
+ * @return String details
*/
public String toString()
{
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerFactory.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerFactory.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerFactory.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServerFactory.java Wed Aug 13 15:14:46 2008
@@ -42,13 +42,16 @@
public class RemoteCacheServerFactory
implements IRemoteCacheConstants
{
+ /** The logger */
private final static Log log = LogFactory.getLog( RemoteCacheServerFactory.class );
/** The single instance of the RemoteCacheServer object. */
private static RemoteCacheServer remoteCacheServer;
+ /** The name of the service. */
private static String serviceName;
+ /** Factory socket time out. */
private static int DEFAULT_RMI_SOCKET_FACTORY_TIMEOUT_MS = 10000;
/** Constructor for the RemoteCacheServerFactory object. */
@@ -60,7 +63,9 @@
/**
* This will allow you to get stats from the server, etc. Perhaps we should provide methods on
* the factory to do this instead.
- * A remote cache is either a local cache or a cluster cache
+ * <p>
+ * A remote cache is either a local cache or a cluster cache.
+ * <p.
* @return Returns the remoteCacheServer.
*/
public static RemoteCacheServer getRemoteCacheServer()
@@ -68,11 +73,13 @@
return remoteCacheServer;
}
- // ///////////////////// Statup/shutdown methods. //////////////////
+ // ///////////////////// Startup/shutdown methods. //////////////////
/**
* Starts up the remote cache server on this JVM, and binds it to the registry on the given host
* and port.
- * A remote cache is either a local cache or a cluster cache
+ * <p>
+ * A remote cache is either a local cache or a cluster cache.
+ * <p>
* @param host
* @param port
* @param propFile
@@ -247,7 +254,9 @@
/**
* Creates an local RMI registry on the default port, starts up the remote cache server, and
* binds it to the registry.
- * A remote cache is either a local cache or a cluster cache
+ * <p>
+ * A remote cache is either a local cache or a cluster cache.
+ * <p>
* @param args The command line arguments
* @throws Exception
*/
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheStartupServlet.java Wed Aug 13 15:14:46 2008
@@ -77,8 +77,10 @@
/**
* Starts the registry and then tries to bind to it.
* <p>
- * Gets the port from a props file. Uses the local host name for the rgistry
- * host. Tries to start the registry, ignoreing failure. Starts the server.
+ * Gets the port from a props file. Uses the local host name for the registry
+ * host. Tries to start the registry, ignoring failure. Starts the server.
+ * <p>
+ * @throws ServletException
*/
public void init()
throws ServletException
@@ -189,10 +191,8 @@
}
}
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.Servlet#destroy()
+ /**
+ * shuts the cache down.
*/
public void destroy()
{
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/CacheEventQueueFactory.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/CacheEventQueueFactory.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/CacheEventQueueFactory.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/CacheEventQueueFactory.java Wed Aug 13 15:14:46 2008
@@ -25,14 +25,13 @@
import org.apache.jcs.engine.behavior.ICacheListener;
/**
- * This class hands out event Queues. This allows us to change the
- * implementation more easily.
+ * This class hands out event Queues. This allows us to change the implementation more easily.
* <p>
* @author aaronsm
*/
public class CacheEventQueueFactory
{
-
+ /** The logger. */
private static final Log log = LogFactory.getLog( CacheEventQueueFactory.class );
/**
@@ -43,10 +42,10 @@
* @param cacheName
* @param threadPoolName
* @param poolType
- * @return
+ * @return ICacheEventQueue
*/
public ICacheEventQueue createCacheEventQueue( ICacheListener listener, long listenerId, String cacheName,
- String threadPoolName, int poolType )
+ String threadPoolName, int poolType )
{
return createCacheEventQueue( listener, listenerId, cacheName, 10, 500, threadPoolName, poolType );
}
@@ -59,15 +58,13 @@
* @param cacheName
* @param maxFailure
* @param waitBeforeRetry
- * @param threadPoolName
- * null is ok, if not a pooled event queue this is ignored
- * @param poolType
- * single or pooled
- * @return
+ * @param threadPoolName null is OK, if not a pooled event queue this is ignored
+ * @param poolType single or pooled
+ * @return ICacheEventQueue
*/
public ICacheEventQueue createCacheEventQueue( ICacheListener listener, long listenerId, String cacheName,
- int maxFailure, int waitBeforeRetry, String threadPoolName,
- int poolType )
+ int maxFailure, int waitBeforeRetry, String threadPoolName,
+ int poolType )
{
if ( log.isDebugEnabled() )
{
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheElementSerialized.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheElementSerialized.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheElementSerialized.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheElementSerialized.java Wed Aug 13 15:14:46 2008
@@ -24,55 +24,50 @@
/**
* This interface defines the behavior of the serialized element wrapper.
* <p>
- * The value is stored as a byte array. This should allow for a variety of
- * serialization mechanisms.
+ * The value is stored as a byte array. This should allow for a variety of serialization mechanisms.
* <p>
* This currently extends ICacheElement for backward compatibility.
- *
+ *<p>
* @author Aaron Smuts
- *
*/
public interface ICacheElementSerialized
extends ICacheElement
{
-
/**
- * Gets the cacheName attribute of the ICacheElement object. The cacheName
- * is also known as the region name.
- *
+ * Gets the cacheName attribute of the ICacheElement object. The cacheName is also known as the
+ * region name.
+ *<p>
* @return The cacheName value
*/
public String getCacheName();
/**
- * Gets the key attribute of the ICacheElementSerialized object. This is the
- * standard key that the value can be reference by.
- *
+ * Gets the key attribute of the ICacheElementSerialized object. This is the standard key that
+ * the value can be reference by.
+ *<p>
* @return The key value
*/
public Serializable getKey();
/**
- * Gets the value attribute of the ICacheElementSerialized object. This is
- * the value the client cached seriailzed by some mechanism.
- *
+ * Gets the value attribute of the ICacheElementSerialized object. This is the value the client
+ * cached serialized by some mechanism.
+ *<p>
* @return The serialized value
*/
public byte[] getSerializedValue();
/**
* Gets the attributes attribute of the ICacheElement object
- *
+ *<p>
* @return The attributes value
*/
public IElementAttributes getElementAttributes();
/**
* Sets the attributes attribute of the ICacheElement object
- *
- * @param attr
- * The new attributes value
+ *<p>
+ * @param attr The new attributes value
*/
public void setElementAttributes( IElementAttributes attr );
-
}
Added: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheEventLogger.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheEventLogger.java?rev=685702&view=auto
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheEventLogger.java (added)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheEventLogger.java Wed Aug 13 15:14:46 2008
@@ -0,0 +1,126 @@
+package org.apache.jcs.engine.behavior;
+
+import java.io.Serializable;
+
+/**
+ * This defines the behavior for event logging. Auxiliaries will send events to injected event
+ * loggers.
+ * <p>
+ * In general all ICache interface methods should call the logger if one is configured. This will be
+ * done on an ad hoc basis for now. Various auxiliaries may have additional events.
+ */
+public interface ICacheEventLogger
+{
+ /** ICache update */
+ static final String UPDATE_EVENT = "update";
+
+ /** ICache get */
+ static final String GET_EVENT = "get";
+
+ /** ICache getMultiple */
+ static final String GETMULTIPLE_EVENT = "getMultiple";
+
+ /** ICache remove */
+ static final String REMOVE_EVENT = "remove";
+
+ /** ICache removeAll */
+ static final String REMOVEALL_EVENT = "removeAll";
+
+ /** ICache dispose */
+ static final String DISPOSE_EVENT = "dispose";
+
+ /**
+ * Logs an event. These are internal application events that do not correspond to ICache calls.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param eventName - e.g. update, get, put, remove
+ * @param optionalDetails - any extra message
+ */
+ void logApplicationEvent( String source, String eventName, String optionalDetails );
+
+ /**
+ * Logs an event.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param optionalDetails - any extra message
+ * @param key - the cache key
+ */
+ void logStartICacheEvent( String source, String region, String eventName, String optionalDetails, Serializable key );
+
+ /**
+ * Logs an event.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param optionalDetails - any extra message
+ * @param item - the item being processed
+ */
+ void logStartICacheEvent( String source, String region, String eventName, String optionalDetails, ICacheElement item );
+
+ /**
+ * Logs an event.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param optionalDetails - any extra message
+ * @param key - the cache key
+ */
+ void logEndICacheEvent( String source, String region, String eventName, String optionalDetails, Serializable key );
+
+ /**
+ * Logs an event.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param optionalDetails - any extra message
+ * @param item - the item being processed
+ */
+ void logEndICacheEvent( String source, String region, String eventName, String optionalDetails, ICacheElement item );
+
+ /**
+ * Logs an error.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param errorMessage - any error message
+ */
+ void logError( String source, String eventName, String errorMessage );
+
+ /**
+ * Logs an error.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param errorMessage - any error message
+ */
+ void logError( String source, String region, String eventName, String errorMessage );
+
+ /**
+ * Logs an error.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param errorMessage - any error message
+ * @param item - the item being processed
+ */
+ void logError( String source, String region, String eventName, String errorMessage, ICacheElement item );
+
+ /**
+ * Logs an error.
+ * <p>
+ * @param source - e.g. RemoteCacheServer
+ * @param region - the name of the region
+ * @param eventName - e.g. update, get, put, remove
+ * @param errorMessage - any error message
+ * @param key - the cache key
+ */
+ void logError( String source, String region, String eventName, String errorMessage, Serializable key );
+}
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/IElementSerializer.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/IElementSerializer.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/IElementSerializer.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/IElementSerializer.java Wed Aug 13 15:14:46 2008
@@ -24,7 +24,7 @@
/**
* Defines the behavior for cache element serializers. This layer of abstraction allows us to plug
- * in different serialization mechanisms, such as XStream.
+ * in different serialization mechanisms, such as a compressing standard serializer.
* <p>
* @author Aaron Smuts
*/
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheConfigurator.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheConfigurator.java?rev=685702&r1=685701&r2=685702&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheConfigurator.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheConfigurator.java Wed Aug 13 15:14:46 2008
@@ -32,19 +32,20 @@
import org.apache.jcs.auxiliary.AuxiliaryCache;
import org.apache.jcs.auxiliary.AuxiliaryCacheAttributes;
import org.apache.jcs.auxiliary.AuxiliaryCacheFactory;
-import org.apache.jcs.config.OptionConverter;
-import org.apache.jcs.config.PropertySetter;
import org.apache.jcs.engine.behavior.ICache;
+import org.apache.jcs.engine.behavior.ICacheEventLogger;
import org.apache.jcs.engine.behavior.ICompositeCacheAttributes;
import org.apache.jcs.engine.behavior.IElementAttributes;
+import org.apache.jcs.engine.behavior.IElementSerializer;
+import org.apache.jcs.utils.config.OptionConverter;
+import org.apache.jcs.utils.config.PropertySetter;
/**
* This class configures JCS based on a properties object.
* <p>
- * This class is based on the log4j class org.apache.log4j.PropertyConfigurator
- * which was made by: "Luke Blanshard" <Lu...@quiq.com>"Mark DONSZELMANN"
- * <Ma...@cern.ch>"Anders Kristensen" <ak...@dynamicsoft.com>
- *
+ * This class is based on the log4j class org.apache.log4j.PropertyConfigurator which was made by:
+ * "Luke Blanshard" <Lu...@quiq.com>"Mark DONSZELMANN" <Ma...@cern.ch>"Anders Kristensen"
+ * <ak...@dynamicsoft.com>
*/
public class CompositeCacheConfigurator
{
@@ -64,11 +65,25 @@
final static String ELEMENT_ATTRIBUTE_PREFIX = ".elementattributes";
+ /**
+ * jcs.auxiliary.NAME.cacheeventlogger=CLASSNAME
+ * <p>
+ * jcs.auxiliary.NAME.cacheeventlogger.attributes.CUSTOMPROPERTY=VALUE
+ */
+ final static String CACHE_EVENT_LOGGER_PREFIX = ".cacheeventlogger";
+
+ /**
+ * jcs.auxiliary.NAME.serializer=CLASSNAME
+ * <p>
+ * jcs.auxiliary.NAME.serializer.attributes.CUSTOMPROPERTY=VALUE
+ */
+ final static String SERIALIZER_PREFIX = ".serializer";
+
private CompositeCacheManager compositeCacheManager;
/**
* Constructor for the CompositeCacheConfigurator object
- *
+ *<p>
* @param ccMgr
*/
public CompositeCacheConfigurator( CompositeCacheManager ccMgr )
@@ -79,9 +94,9 @@
/**
* Configure cached for file name.
* <p>
- * This is only used for testing. The manager handles the translation of a
- * file into a properties object.
- *
+ * This is only used for testing. The manager handles the translation of a file into a
+ * properties object.
+ * <p>
* @param configFileName
*/
protected void doConfigure( String configFileName )
@@ -115,7 +130,6 @@
* <li>Setup system caches to be used
* <li>Setup preconfigured caches
* </ul>
- *
* @param properties
*/
public void doConfigure( Properties properties )
@@ -124,10 +138,13 @@
// store props for use by non configured caches
compositeCacheManager.props = properties;
+
// set default value list
setDefaultAuxValues( properties );
+
// set default cache attr
setDefaultCompositeCacheAttributes( properties );
+
// set default element attr
setDefaultElementAttributes( properties );
@@ -148,7 +165,7 @@
/**
* Set the default aux list for new caches.
- *
+ * <p>
* @param props
*/
protected void setDefaultAuxValues( Properties props )
@@ -164,7 +181,7 @@
/**
* Set the default CompositeCacheAttributes for new caches.
- *
+ *<p>
* @param props
*/
protected void setDefaultCompositeCacheAttributes( Properties props )
@@ -178,7 +195,7 @@
/**
* Set the default ElementAttributes for new caches.
- *
+ *<p>
* @param props
*/
protected void setDefaultElementAttributes( Properties props )
@@ -190,9 +207,8 @@
}
/**
- * Create caches used internally. System status gives them creation
- * priority.
- *
+ * Create caches used internally. System status gives them creation priority.
+ *<p>
* @param props
*/
protected void parseSystemRegions( Properties props )
@@ -220,7 +236,7 @@
/**
* Parse region elements.
- *
+ *<p>
* @param props
*/
protected void parseRegions( Properties props )
@@ -237,11 +253,11 @@
regionNames.add( regionName );
- String value = OptionConverter.findAndSubst( key, props );
+ String auxiliaryList = OptionConverter.findAndSubst( key, props );
ICache cache;
synchronized ( regionName )
{
- cache = parseRegion( props, regionName, value );
+ cache = parseRegion( props, regionName, auxiliaryList );
}
compositeCacheManager.caches.put( regionName, cache );
}
@@ -251,12 +267,11 @@
{
log.info( "Parsed regions " + regionNames );
}
-
}
/**
* Create cache region.
- *
+ *<p>
* @param props
* @param regName
* @param value
@@ -270,8 +285,8 @@
/**
* Get all the properties for a region and configure its cache.
* <p>
- * This method tells the otehr parse method the name of the region prefix.
- *
+ * This method tells the other parse method the name of the region prefix.
+ *<p>
* @param props
* @param regName
* @param value
@@ -285,7 +300,7 @@
/**
* Get all the properties for a region and configure its cache.
- *
+ *<p>
* @param props
* @param regName
* @param value
@@ -294,7 +309,7 @@
* @return CompositeCache
*/
protected CompositeCache parseRegion( Properties props, String regName, String value,
- ICompositeCacheAttributes cca, String regionPrefix )
+ ICompositeCacheAttributes cca, String regionPrefix )
{
// First, create or get the cache and element attributes, and create
// the cache.
@@ -362,7 +377,7 @@
/**
* Get an compositecacheattributes for the listed region.
- *
+ *<p>
* @param props
* @param regName
* @return
@@ -374,14 +389,14 @@
/**
* Get the main attributes for a region.
- *
+ *<p>
* @param props
* @param regName
* @param regionPrefix
* @return ICompositeCacheAttributes
*/
protected ICompositeCacheAttributes parseCompositeCacheAttributes( Properties props, String regName,
- String regionPrefix )
+ String regionPrefix )
{
ICompositeCacheAttributes ccAttr;
@@ -396,7 +411,8 @@
{
if ( log.isInfoEnabled() )
{
- log.info( "No special CompositeCacheAttributes class defined for key [" + attrName + "], using default class." );
+ log.info( "No special CompositeCacheAttributes class defined for key [" + attrName
+ + "], using default class." );
}
ICompositeCacheAttributes ccAttr2 = compositeCacheManager.getDefaultCacheAttributes();
@@ -422,9 +438,8 @@
}
/**
- * Create the element attributes from the properties object for a cache
- * region.
- *
+ * Create the element attributes from the properties object for a cache region.
+ *<p>
* @param props
* @param regName
* @param regionPrefix
@@ -471,15 +486,11 @@
/**
* Get an aux cache for the listed aux for a region.
- *
- * @param cache
- * the cache manager
- * @param props
- * the configuration propeties
- * @param auxName
- * the name of the auxiliary cache
- * @param regName
- * the name of the region.
+ *<p>
+ * @param cache the cache manager
+ * @param props the configuration properties
+ * @param auxName the name of the auxiliary cache
+ * @param regName the name of the region.
* @return AuxiliaryCache
*/
protected AuxiliaryCache parseAuxiliary( CompositeCache cache, Properties props, String auxName, String regName )
@@ -521,7 +532,7 @@
String prefix = AUXILIARY_PREFIX + auxName + ATTRIBUTE_PREFIX;
auxAttr = (AuxiliaryCacheAttributes) OptionConverter
.instantiateByKey( props, prefix, org.apache.jcs.auxiliary.AuxiliaryCacheAttributes.class, null );
- if ( auxFac == null )
+ if ( auxAttr == null )
{
log.error( "Could not instantiate auxAttr named '" + attrName + "'" );
return null;
@@ -547,11 +558,70 @@
// GET CACHE FROM FACTORY WITH ATTRIBUTES
auxAttr.setCacheName( regName );
+
+ // CONFIGURE THE EVENT LOGGER
+ ICacheEventLogger cacheEventLogger = parseCacheEventLogger( props, auxName );
+
+ // CONFIGURE THE ELEMENT SERIALIZER
+ IElementSerializer elementSerializer = parseElementSerializer( props, auxName );
+
// Consider putting the compositeCache back in the factory interface
// since the manager may not know about it at this point.
- // need to make sure the maanger already has the cache
+ // need to make sure the manager already has the cache
// before the auxiliary is created.
- auxCache = auxFac.createCache( auxAttr, compositeCacheManager );
+ auxCache = auxFac.createCache( auxAttr, compositeCacheManager, cacheEventLogger, elementSerializer );
+
return auxCache;
}
+
+ /**
+ * Parses the event logger config, if there is any for the auxiliary.
+ * <p>
+ * @param props
+ * @param auxName
+ * @return cacheEventLogger
+ */
+ protected ICacheEventLogger parseCacheEventLogger( Properties props, String auxName )
+ {
+ ICacheEventLogger cacheEventLogger = null;
+
+ // auxFactory was not previously initialized.
+ String eventLoggerClassName = AUXILIARY_PREFIX + auxName + CACHE_EVENT_LOGGER_PREFIX;
+ cacheEventLogger = (ICacheEventLogger) OptionConverter
+ .instantiateByKey( props, eventLoggerClassName, org.apache.jcs.engine.behavior.ICacheEventLogger.class,
+ null );
+ if ( cacheEventLogger != null )
+ {
+ String cacheEventLoggerAttributePrefix = AUXILIARY_PREFIX + auxName + CACHE_EVENT_LOGGER_PREFIX
+ + ATTRIBUTE_PREFIX;
+ PropertySetter.setProperties( cacheEventLogger, props, cacheEventLoggerAttributePrefix + "." );
+ }
+ return cacheEventLogger;
+ }
+
+ /**
+ * Parses the element config, if there is any for the auxiliary.
+ * <p>
+ * @param props
+ * @param auxName
+ * @return cacheEventLogger
+ */
+ protected IElementSerializer parseElementSerializer( Properties props, String auxName )
+ {
+ // TODO take in the entire prop key
+
+ IElementSerializer elementSerializer = null;
+
+ // auxFactory was not previously initialized.
+ String elementSerializerClassName = AUXILIARY_PREFIX + auxName + SERIALIZER_PREFIX;
+ elementSerializer = (IElementSerializer) OptionConverter
+ .instantiateByKey( props, elementSerializerClassName,
+ org.apache.jcs.engine.behavior.IElementSerializer.class, null );
+ if ( elementSerializer != null )
+ {
+ String cacheEventLoggerAttributePrefix = AUXILIARY_PREFIX + auxName + SERIALIZER_PREFIX + ATTRIBUTE_PREFIX;
+ PropertySetter.setProperties( elementSerializer, props, cacheEventLoggerAttributePrefix + "." );
+ }
+ return elementSerializer;
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jcs-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jcs-dev-help@jakarta.apache.org