Author: asmuts
Date: Fri Apr 11 11:43:26 2008
New Revision: 647264
URL: http://svn.apache.org/viewvc?rev=647264&view=rev
Log:
Committing a patch by Chris Fairbanks. It allows clients to retrieve multple items from the cache with a single call.
Added:
jakarta/jcs/trunk/ant_eclipse_jar_install.xml
Modified:
jakarta/jcs/trunk/pom.xml
jakarta/jcs/trunk/project.xml
jakarta/jcs/trunk/src/java/org/apache/jcs/access/CacheAccess.java
jakarta/jcs/trunk/src/java/org/apache/jcs/access/behavior/ICacheAccess.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/AuxiliaryCache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/AbstractDiskCache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWait.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWaitFacade.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/behavior/ILateralCacheService.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPService.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWait.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWaitFacade.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/ZombieRemoteCacheService.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/behavior/IRemoteCacheService.java
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/server/RemoteCacheServer.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/ZombieCacheService.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheService.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/AbstractMemoryCache.java
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/behavior/IMemoryCache.java
jakarta/jcs/trunk/src/test-conf/TestTCPLateralIssueRemoveCache.ccf
jakarta/jcs/trunk/src/test-conf/TestTCPLateralRemoveFilter.ccf
jakarta/jcs/trunk/src/test/org/apache/jcs/access/CacheAccessUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/access/TestCacheAccess.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/AuxiliaryCacheMockImpl.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/block/BlockDiskCacheConcurrentUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/block/BlockDiskCacheSameRegionConcurrentUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/indexed/IndexDiskCacheUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheConcurrentNoDeadLockUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheConcurrentUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheNoMemoryUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCacheSameRegionConcurrentUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/jdbc/JDBCDiskCacheUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/jdbc/hsql/HSQLDiskCacheConcurrentUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/jdbc/hsql/HSQLDiskCacheUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/jdbc/mysql/MySQLDiskCacheHsqlBackedUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPFilterRemoveHashCodeUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPIssueRemoveOnPutUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/remote/RemoteCacheClientMockImpl.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/remote/RemoteCacheNoWaitUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/remote/RemoteCacheServiceMockImpl.java
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/remote/server/BasicRemoteCacheClientServerUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/engine/control/CompositeCacheDiskUsageUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/engine/memory/MemoryCacheMockImpl.java
jakarta/jcs/trunk/src/test/org/apache/jcs/engine/memory/lru/LRUMemoryCacheConcurrentUnitTest.java
jakarta/jcs/trunk/src/test/org/apache/jcs/engine/memory/mru/MRUMemoryCacheUnitTest.java
Added: jakarta/jcs/trunk/ant_eclipse_jar_install.xml
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/ant_eclipse_jar_install.xml?rev=647264&view=auto
==============================================================================
--- jakarta/jcs/trunk/ant_eclipse_jar_install.xml (added)
+++ jakarta/jcs/trunk/ant_eclipse_jar_install.xml Fri Apr 11 11:43:26 2008
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<!--
+ 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.
+-->
+
+<project name="ant_eclipse" basedir="." default="default">
+
+ <!-- bring in the environmental properties -->
+ <property environment="env"/>
+ <property name="maven.home" value="${env.MAVEN_HOME}"/>
+
+ <!-- make sure we have maven -->
+ <target name="check-env" description="Check if environment variables are set">
+ <echo>maven.home = ${maven.home}</echo>
+ <fail unless="env.MAVEN_HOME" message="You MUST set MAVEN_HOME first"/>
+ </target>
+
+ <target name="default" depends="check-env">
+
+ <condition property="maven.script" value="maven.bat">
+ <and>
+ <os family="windows" />
+ <equals arg1="${maven.script}" arg2="$${maven.script}" />
+ <not>
+ <isset property="cygwin.home" />
+ </not>
+ </and>
+ </condition>
+
+ <condition property="maven.script" value="maven">
+ <equals arg1="${maven.script}" arg2="$${maven.script}" />
+ </condition>
+
+ <!-- call maven jar:install -Dtest=Unit -->
+ <exec executable="${maven.script}" failonerror="true">
+ <arg value="jar:install"/>
+ <arg value="-Dtest=Unit"/>
+ </exec>
+
+ </target>
+
+</project>
Modified: jakarta/jcs/trunk/pom.xml
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/pom.xml?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/pom.xml (original)
+++ jakarta/jcs/trunk/pom.xml Fri Apr 11 11:43:26 2008
@@ -36,7 +36,7 @@
<groupId>org.apache.jcs</groupId>
<artifactId>jcs</artifactId>
<packaging>pom</packaging>
- <version>1.3</version>
+ <version>1.3.1.0-RC</version>
<name>Jakarta JCS</name>
<url>http://jakarta.apache.org/jcs/</url>
<inceptionYear>2002</inceptionYear>
Modified: jakarta/jcs/trunk/project.xml
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/project.xml?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/project.xml (original)
+++ jakarta/jcs/trunk/project.xml Fri Apr 11 11:43:26 2008
@@ -23,7 +23,7 @@
<pomVersion>3</pomVersion>
<name>JCS</name>
<id>jcs</id>
- <currentVersion>1.3</currentVersion>
+ <currentVersion>1.3.1.0-RC</currentVersion>
<organization>
<name>Apache Software Foundation</name>
<url>http://jakarta.apache.org/</url>
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/access/CacheAccess.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/access/CacheAccess.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/access/CacheAccess.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/access/CacheAccess.java Fri Apr 11 11:43:26 2008
@@ -21,6 +21,8 @@
import java.io.IOException;
import java.io.Serializable;
+import java.util.Map;
+import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -202,7 +204,7 @@
* This method is most useful if you want to determine things such as the how long the element
* has been in the cache.
* <p>
- * The last access time in teh ElementAttributes should be current.
+ * The last access time in the ElementAttributes should be current.
* <p>
* @param name Key the object is stored as
* @return The ICacheElement if the object is found or null
@@ -213,6 +215,28 @@
}
/**
+ * Get multiple elements from the cache based on a set of cache keys.
+ * <p>
+ * This method returns the ICacheElement wrapper which provides access to element info and other
+ * attributes.
+ * <p>
+ * This returns a reference to the wrapper. Any modifications will be reflected in the cache. No
+ * defensive copy is made.
+ * <p>
+ * This method is most useful if you want to determine things such as the how long the element
+ * has been in the cache.
+ * <p>
+ * The last access time in the ElementAttributes should be current.
+ * <p>
+ * @param names set of Object cache keys
+ * @return a map of Object key to ICacheElement element, or empty map if none of the keys are present
+ */
+ public Map getCacheElements( Set names )
+ {
+ return this.cacheControl.getMultiple( names );
+ }
+
+ /**
* Place a new object in the cache, associated with key name. If there is currently an object
* associated with name in the region an ObjectExistsException is thrown. Names are scoped to a
* region so they must be unique within the region they are placed.
@@ -377,7 +401,7 @@
* TODO is should be renamed "setDefaultElementAttributes"
* <p>
* @deprecated As of release 1.3
- * @see setDefaultElementAttributes
+ * @see #setDefaultElementAttributes(IElementAttributes)
* @param attr New attributes for this region.
* @exception CacheException
* @exception InvalidHandleException
@@ -417,6 +441,7 @@
throws CacheException, InvalidHandleException
{
ICacheElement element = this.cacheControl.get( (Serializable) name );
+
if ( element == null )
{
throw new InvalidHandleException( "Object for name [" + name + "] is not in the cache" );
@@ -426,8 +451,8 @@
// i.e. don't do this:
// element.setElementAttributes( attr );
// Another reason to call put is to force the changes to be distributed.
- put( element.getKey(), element.getVal(), attr );
+ put( element.getKey(), element.getVal(), attr );
}
/**
@@ -437,7 +462,7 @@
* This was confusing, so I created a new method with a clear name.
* <p>
* @deprecated As of release 1.3
- * @see getDefaultElementAttributes
+ * @see #getDefaultElementAttributes
* @return Attributes for this region
* @exception CacheException
*/
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/access/behavior/ICacheAccess.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/access/behavior/ICacheAccess.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/access/behavior/ICacheAccess.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/access/behavior/ICacheAccess.java Fri Apr 11 11:43:26 2008
@@ -19,7 +19,11 @@
* under the License.
*/
+import java.util.Map;
+import java.util.Set;
+
import org.apache.jcs.access.exception.CacheException;
+import org.apache.jcs.engine.behavior.ICacheElement;
import org.apache.jcs.engine.behavior.ICompositeCacheAttributes;
import org.apache.jcs.engine.behavior.IElementAttributes;
@@ -68,11 +72,47 @@
throws CacheException;
/**
+ * This method returns the ICacheElement wrapper which provides access to element info and other
+ * attributes.
+ * <p>
+ * This returns a reference to the wrapper. Any modifications will be reflected in the cache. No
+ * defensive copy is made.
+ * <p>
+ * This method is most useful if you want to determine things such as the how long the element
+ * has been in the cache.
+ * <p>
+ * The last access time in the ElementAttributes should be current.
+ * <p>
+ * @param name Key the object is stored as
+ * @return The ICacheElement if the object is found or null
+ */
+ ICacheElement getCacheElement( Object name );
+
+ /**
+ * Get multiple elements from the cache based on a set of cache keys.
+ * <p>
+ * This method returns the ICacheElement wrapper which provides access to element info and other
+ * attributes.
+ * <p>
+ * This returns a reference to the wrapper. Any modifications will be reflected in the cache. No
+ * defensive copy is made.
+ * <p>
+ * This method is most useful if you want to determine things such as the how long the element
+ * has been in the cache.
+ * <p>
+ * The last access time in the ElementAttributes should be current.
+ * <p>
+ * @param names set of Object cache keys
+ * @return a map of Object key to ICacheElement element, or empty map if none of the keys are present
+ */
+ Map getCacheElements( Set names );
+
+ /**
* Removes an item or all items. Should be called remove.
* <p>
* @throws CacheException
* @deprecated
- * @see #remove
+ * @see #remove()
*/
void destroy()
throws CacheException;
@@ -90,7 +130,7 @@
* @param name
* @throws CacheException
* @deprecated
- * @see #remove
+ * @see #remove(Object)
*/
void destroy( Object name )
throws CacheException;
@@ -114,20 +154,20 @@
* Only object loaded after the reset will use the new defaults. If no name
* argument is provided, the reset is applied to the region.
* <p>
- * @param attr
+ * @param attributes
* @throws CacheException
*/
- void resetElementAttributes( IElementAttributes attr )
+ void resetElementAttributes( IElementAttributes attributes )
throws CacheException;
/**
* Reset the attributes on the object matching this key name.
* <p>
* @param name
- * @param attr
+ * @param attributes
* @throws CacheException
*/
- void resetElementAttributes( Object name, IElementAttributes attr )
+ void resetElementAttributes( Object name, IElementAttributes attributes )
throws CacheException;
/**
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/AuxiliaryCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/AuxiliaryCache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/AuxiliaryCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/AuxiliaryCache.java Fri Apr 11 11:43:26 2008
@@ -20,11 +20,9 @@
*/
import java.io.IOException;
-import java.io.Serializable;
import java.util.Set;
import org.apache.jcs.engine.behavior.ICache;
-import org.apache.jcs.engine.behavior.ICacheElement;
import org.apache.jcs.engine.stats.behavior.IStats;
/**
@@ -38,83 +36,24 @@
extends ICache
{
/**
- * Puts an item to the cache.
- * @param ce
- * @throws IOException
- */
- public void update( ICacheElement ce )
- throws IOException;
-
- /**
- * Gets an item from the cache.
- * @param key
- * @return
- * @throws IOException
- */
- public ICacheElement get( Serializable key )
- throws IOException;
-
- /**
- * Removes an item from the cache.
- * @param key
- * @return
- * @throws IOException
- */
- public boolean remove( Serializable key )
- throws IOException;
-
- /**
- * Removes all cached items from the cache.
- * @throws IOException
- */
- public void removeAll()
- throws IOException;
-
- /**
- * Prepares for shutdown.
- * @throws IOException
- */
- public void dispose()
- throws IOException;
-
- /**
- * Returns the current cache size.
- * @return
- */
- public int getSize();
-
- /**
- * Returns the cache status.
- * @return
- */
- public int getStatus();
-
- /**
- * Returns the cache name.
- * @return
- */
- public String getCacheName();
-
- /**
* Gets the set of keys of objects currently in the group
* @param group
* @return a set of group keys
* @throws IOException
*/
- public Set getGroupKeys( String group )
+ Set getGroupKeys( String group )
throws IOException;
/**
- * Returns the historical and statistical data for a region's auxiliary cache.
- * @return
+ * @return the historical and statistical data for a region's auxiliary cache.
*/
- public IStats getStatistics();
+ IStats getStatistics();
/**
* This returns the generic attributes for an auxiliary cache. Most implementations will cast
* this to a more specific type.
* <p>
- * @return
+ * @return the attributes for the auxiliary cache
*/
- public AuxiliaryCacheAttributes getAuxiliaryCacheAttributes();
+ AuxiliaryCacheAttributes getAuxiliaryCacheAttributes();
}
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/AbstractDiskCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/AbstractDiskCache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/AbstractDiskCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/AbstractDiskCache.java Fri Apr 11 11:43:26 2008
@@ -24,6 +24,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -299,6 +300,36 @@
}
return null;
+ }
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public final Map getMultiple( Set keys )
+ {
+ Map elements = new HashMap();
+
+ if ( keys != null && !keys.isEmpty() )
+ {
+ Iterator iterator = keys.iterator();
+
+ while ( iterator.hasNext() )
+ {
+ Serializable key = (Serializable) iterator.next();
+
+ ICacheElement element = get( key );
+
+ if ( element != null )
+ {
+ elements.put( key, element );
+ }
+ }
+ }
+
+ return elements;
}
/**
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCache.java Fri Apr 11 11:43:26 2008
@@ -21,6 +21,9 @@
import java.io.IOException;
import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -138,6 +141,38 @@
handleException( e, "Failed to get " + key + " from " + this.cattr.getCacheName() );
}
return obj;
+ }
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ throws IOException
+ {
+ Map elements = new HashMap();
+
+ if ( keys != null && !keys.isEmpty() )
+ {
+ Iterator iterator = keys.iterator();
+
+ while ( iterator.hasNext() )
+ {
+ Serializable key = (Serializable) iterator.next();
+
+ ICacheElement element = get( key );
+
+ if ( element != null )
+ {
+ elements.put( key, element );
+ }
+ }
+ }
+
+ return elements;
}
/**
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWait.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWait.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWait.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWait.java Fri Apr 11 11:43:26 2008
@@ -24,7 +24,10 @@
import java.rmi.UnmarshalException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -148,6 +151,36 @@
}
}
return null;
+ }
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ {
+ Map elements = new HashMap();
+
+ if ( keys != null && !keys.isEmpty() )
+ {
+ Iterator iterator = keys.iterator();
+
+ while ( iterator.hasNext() )
+ {
+ Serializable key = (Serializable) iterator.next();
+
+ ICacheElement element = get( key );
+
+ if ( element != null )
+ {
+ elements.put( key, element );
+ }
+ }
+ }
+
+ return elements;
}
public Set getGroupKeys( String groupName )
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWaitFacade.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWaitFacade.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWaitFacade.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/LateralCacheNoWaitFacade.java Fri Apr 11 11:43:26 2008
@@ -23,7 +23,10 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.HashSet;
@@ -171,6 +174,36 @@
return null;
}
return null;
+ }
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ {
+ Map elements = new HashMap();
+
+ if ( keys != null && !keys.isEmpty() )
+ {
+ Iterator iterator = keys.iterator();
+
+ while ( iterator.hasNext() )
+ {
+ Serializable key = (Serializable) iterator.next();
+
+ ICacheElement element = get( key );
+
+ if ( element != null )
+ {
+ elements.put( key, element );
+ }
+ }
+ }
+
+ return elements;
}
/*
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/behavior/ILateralCacheService.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/behavior/ILateralCacheService.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/behavior/ILateralCacheService.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/behavior/ILateralCacheService.java Fri Apr 11 11:43:26 2008
@@ -26,9 +26,7 @@
import org.apache.jcs.engine.behavior.ICacheElement;
import org.apache.jcs.engine.behavior.ICacheService;
-/**
- * Used to retrieve and update the lateral cache.
- */
+/** Used to retrieve and update the lateral cache. */
public interface ILateralCacheService
extends ICacheService
{
@@ -39,7 +37,7 @@
* @param requesterId
* @throws IOException
*/
- public void update( ICacheElement item, long requesterId )
+ void update( ICacheElement item, long requesterId )
throws IOException;
/**
@@ -50,7 +48,7 @@
* @param requesterId
* @throws IOException
*/
- public void remove( String cacheName, Serializable key, long requesterId )
+ void remove( String cacheName, Serializable key, long requesterId )
throws IOException;
/**
@@ -60,13 +58,13 @@
* @param requesterId
* @throws IOException
*/
- public void removeAll( String cacheName, long requesterId )
+ void removeAll( String cacheName, long requesterId )
throws IOException;
/**
* @param cacheName
* @param groupName
- * @return
+ * @return keys
*/
- public Set getGroupKeys( String cacheName, String groupName );
+ Set getGroupKeys( String cacheName, String groupName );
}
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java Fri Apr 11 11:43:26 2008
@@ -41,22 +41,31 @@
*/
public class LateralTCPSender
{
+ /** The logger */
private final static Log log = LogFactory.getLog( LateralTCPSender.class );
+ /** Config */
private ITCPLateralCacheAttributes tcpLateralCacheAttributes;
+ /** The hostname of the remote server. */
private String remoteHost;
+ /** The address of the server */
private InetAddress address;
+ /** The port the server is listening to. */
int port = 1111;
+ /** The stream from the server connection. */
private ObjectOutputStream oos;
+ /** The socket connection with the server. */
private Socket socket;
+ /** counter, for periodic OOS reset. */
int counter = 0;
+ /** how many messages sent */
private int sendCnt = 0;
// reset the ObjectOutputStream every 70 calls
@@ -67,6 +76,7 @@
// a stream cached version.
// I can't replicate an issue that was reported, so I'm not changing the
// reset frequency for now.
+ /** How often we need to reset the stream. */
private final static int RESET_FREQUENCY = 70;
/**
@@ -250,7 +260,7 @@
* laterals, then you have to make 10 failed gets to find out none of the caches have the item.
* <p>
* @param led
- * @return
+ * @return ICacheElement
* @throws IOException
*/
public ICacheElement sendAndReceive( LateralElementDescriptor led )
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPService.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPService.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPService.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPService.java Fri Apr 11 11:43:26 2008
@@ -23,6 +23,9 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -235,6 +238,39 @@
// nothing needs to be done
return null;
}
+ }
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( String cacheName, Set keys )
+ throws IOException
+ {
+ Map elements = new HashMap();
+
+ if ( keys != null && !keys.isEmpty() )
+ {
+ Iterator iterator = keys.iterator();
+
+ while ( iterator.hasNext() )
+ {
+ Serializable key = (Serializable) iterator.next();
+
+ ICacheElement element = get( cacheName, key );
+
+ if ( element != null )
+ {
+ elements.put( key, element );
+ }
+ }
+ }
+
+ return elements;
}
/**
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCache.java Fri Apr 11 11:43:26 2008
@@ -26,6 +26,9 @@
import java.net.Socket;
import java.rmi.server.RMISocketFactory;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -204,8 +207,7 @@
// convert so we don't have to know about the object on the
// other end.
- serialized = SerializationConversionUtil
- .getSerializedCacheElement( ce, this.elementSerializer );
+ serialized = SerializationConversionUtil.getSerializedCacheElement( ce, this.elementSerializer );
remote.update( serialized, getListenerId() );
}
@@ -281,6 +283,38 @@
}
/**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ throws IOException
+ {
+ Map elements = new HashMap();
+
+ if ( keys != null && !keys.isEmpty() )
+ {
+ Iterator iterator = keys.iterator();
+
+ while ( iterator.hasNext() )
+ {
+ Serializable key = (Serializable) iterator.next();
+
+ ICacheElement element = get( key );
+
+ if ( element != null )
+ {
+ elements.put( key, element );
+ }
+ }
+ }
+
+ return elements;
+ }
+
+ /**
* This allows gets to timeout in case of remote server machine shutdown.
* <p>
* @param key
@@ -504,7 +538,7 @@
{
se = new StatElement();
se.setName( "Zombie Queue Size" );
- se.setData( "" + ((ZombieRemoteCacheService)remote).getQueueSize() );
+ se.setData( "" + ( (ZombieRemoteCacheService) remote ).getQueueSize() );
elems.add( se );
}
@@ -554,11 +588,11 @@
{
if ( this.remote != null && this.remote instanceof ZombieRemoteCacheService )
{
- ZombieRemoteCacheService zombie = (ZombieRemoteCacheService)this.remote;
+ ZombieRemoteCacheService zombie = (ZombieRemoteCacheService) this.remote;
this.remote = remote;
try
{
- zombie.propagateEvents( remote );
+ zombie.propagateEvents( remote );
}
catch ( Exception e )
{
@@ -590,10 +624,10 @@
private void handleException( Exception ex, String msg )
throws IOException
{
- log.error( "Disabling remote cache due to error: " + msg , ex );
+ log.error( "Disabling remote cache due to error: " + msg, ex );
// we should not switch if the existing is a zombie.
- if ( remote == null || !(remote instanceof ZombieRemoteCacheService) )
+ if ( remote == null || !( remote instanceof ZombieRemoteCacheService ) )
{
// TODO make configurable
remote = new ZombieRemoteCacheService( irca.getZombieQueueMaxSize() );
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWait.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWait.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWait.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWait.java Fri Apr 11 11:43:26 2008
@@ -24,7 +24,9 @@
import java.rmi.UnmarshalException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -64,18 +66,28 @@
public class RemoteCacheNoWait
implements AuxiliaryCache
{
+ /** For serialization. Don't change. */
private static final long serialVersionUID = -3104089136003714717L;
+ /** log instance */
private final static Log log = LogFactory.getLog( RemoteCacheNoWait.class );
+ /** The remote cache client */
private final IRemoteCacheClient cache;
+ /** Event queue for queueing up calls like put and remove. */
private ICacheEventQueue cacheEventQueue;
+ /** how many times get has been called. */
private int getCount = 0;
+ /** how many times getMultiple has been called. */
+ private int getMultipleCount = 0;
+
+ /** how many times remove has been called. */
private int removeCount = 0;
+ /** how many times put has been called. */
private int putCount = 0;
/**
@@ -87,10 +99,10 @@
public RemoteCacheNoWait( IRemoteCacheClient cache )
{
this.cache = cache;
- CacheEventQueueFactory fact = new CacheEventQueueFactory();
- this.cacheEventQueue = fact.createCacheEventQueue( new CacheAdaptor( cache ), cache.getListenerId(), cache.getCacheName(),
- cache.getAuxiliaryCacheAttributes().getEventQueuePoolName(), cache
- .getAuxiliaryCacheAttributes().getEventQueueTypeFactoryCode() );
+ CacheEventQueueFactory factory = new CacheEventQueueFactory();
+ this.cacheEventQueue = factory.createCacheEventQueue( new CacheAdaptor( cache ), cache.getListenerId(), cache
+ .getCacheName(), cache.getAuxiliaryCacheAttributes().getEventQueuePoolName(), cache
+ .getAuxiliaryCacheAttributes().getEventQueueTypeFactoryCode() );
if ( cache.getStatus() == CacheConstants.STATUS_ERROR )
{
@@ -104,19 +116,19 @@
* (non-Javadoc)
* @see org.apache.jcs.engine.behavior.ICache#update(org.apache.jcs.engine.behavior.ICacheElement)
*/
- public void update( ICacheElement ce )
+ public void update( ICacheElement element )
throws IOException
{
putCount++;
try
{
- cacheEventQueue.addPutEvent( ce );
+ cacheEventQueue.addPutEvent( element );
}
- catch ( IOException ex )
+ catch ( IOException e )
{
- log.error( "Problem adding putEvent to queue.", ex );
+ log.error( "Problem adding putEvent to queue.", e );
cacheEventQueue.destroy();
- throw ex;
+ throw e;
}
}
@@ -124,7 +136,7 @@
* Synchronously reads from the remote cache.
* <p>
* @param key
- * @return
+ * @return element from the remote cache, or null if not present
* @throws IOException
*/
public ICacheElement get( Serializable key )
@@ -141,6 +153,7 @@
{
log.debug( "Retrying the get owing to UnmarshalException..." );
}
+
try
{
return cache.get( key );
@@ -160,9 +173,61 @@
// Since get does not use the queue, I dont want to killing the queue.
throw ex;
}
+
return null;
}
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * Sends the getMultiple request on to the server rather than looping through the requested keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ throws IOException
+ {
+ getMultipleCount++;
+ try
+ {
+ return cache.getMultiple( keys );
+ }
+ catch ( UnmarshalException ue )
+ {
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "Retrying the getMultiple owing to UnmarshalException..." );
+ }
+
+ try
+ {
+ return cache.getMultiple( keys );
+ }
+ catch ( IOException ex )
+ {
+ if ( log.isInfoEnabled() )
+ {
+ log.info( "Failed in retrying the getMultiple for the second time. " + ex.getMessage() );
+ }
+ }
+ }
+ catch ( IOException ex )
+ {
+ // We don't want to destroy the queue on a get failure.
+ // The RemoteCache will Zombie and queue.
+ // Since get does not use the queue, I dont want to killing the queue.
+ throw ex;
+ }
+
+ return new HashMap();
+ }
+
+ /**
+ * @param groupName
+ * @return the keys for the group name
+ * @throws IOException
+ */
public Set getGroupKeys( String groupName )
throws IOException
{
@@ -173,7 +238,7 @@
* Adds a remove request to the remote cache.
* <p>
* @param key
- * @return
+ * @return if this was successful
* @throws IOException
*/
public boolean remove( Serializable key )
@@ -184,11 +249,11 @@
{
cacheEventQueue.addRemoveEvent( key );
}
- catch ( IOException ex )
+ catch ( IOException e )
{
- log.error( "Problem adding RemoveEvent to queue.", ex );
+ log.error( "Problem adding RemoveEvent to queue.", e );
cacheEventQueue.destroy();
- throw ex;
+ throw e;
}
return false;
}
@@ -205,11 +270,11 @@
{
cacheEventQueue.addRemoveAllEvent();
}
- catch ( IOException ex )
+ catch ( IOException e )
{
- log.error( "Problem adding RemoveAllEvent to queue.", ex );
+ log.error( "Problem adding RemoveAllEvent to queue.", e );
cacheEventQueue.destroy();
- throw ex;
+ throw e;
}
}
@@ -220,9 +285,9 @@
{
cacheEventQueue.addDisposeEvent();
}
- catch ( IOException ex )
+ catch ( IOException e )
{
- log.error( "Problem adding DisposeEvent to queue.", ex );
+ log.error( "Problem adding DisposeEvent to queue.", e );
cacheEventQueue.destroy();
}
}
@@ -293,9 +358,9 @@
ICacheEventQueue previousQueue = cacheEventQueue;
CacheEventQueueFactory fact = new CacheEventQueueFactory();
- this.cacheEventQueue = fact.createCacheEventQueue( new CacheAdaptor( cache ), cache.getListenerId(), cache.getCacheName(),
- cache.getAuxiliaryCacheAttributes().getEventQueuePoolName(), cache
- .getAuxiliaryCacheAttributes().getEventQueueTypeFactoryCode() );
+ this.cacheEventQueue = fact.createCacheEventQueue( new CacheAdaptor( cache ), cache.getListenerId(), cache
+ .getCacheName(), cache.getAuxiliaryCacheAttributes().getEventQueuePoolName(), cache
+ .getAuxiliaryCacheAttributes().getEventQueueTypeFactoryCode() );
if ( previousQueue.isWorking() )
{
@@ -311,7 +376,7 @@
/**
* This is temporary. It allows the manager to get the lister.
* <p>
- * @return
+ * @return the instance of the remote cache client used by this object
*/
protected IRemoteCacheClient getRemoteCache()
{
@@ -357,9 +422,8 @@
return getStatistics().toString();
}
- /*
- * (non-Javadoc)
- * @see org.apache.jcs.auxiliary.AuxiliaryCache#getStatistics()
+ /**
+ * @return statistics about this communication
*/
public IStats getStatistics()
{
@@ -413,6 +477,11 @@
se = new StatElement();
se.setName( "Get Count" );
se.setData( "" + this.getCount );
+ elems.add( se );
+
+ se = new StatElement();
+ se.setName( "GetMultiple Count" );
+ se.setData( "" + this.getMultipleCount );
elems.add( se );
se = new StatElement();
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWaitFacade.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWaitFacade.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWaitFacade.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/RemoteCacheNoWaitFacade.java Fri Apr 11 11:43:26 2008
@@ -23,8 +23,10 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -50,18 +52,22 @@
public class RemoteCacheNoWaitFacade
implements AuxiliaryCache
{
+ /** For serialization. Don't change.*/
private static final long serialVersionUID = -4529970797620747110L;
+ /** log instance */
private final static Log log = LogFactory.getLog( RemoteCacheNoWaitFacade.class );
/** The connection to a remote server, or a zombie. */
public RemoteCacheNoWait[] noWaits;
+ /** The cache name */
private String cacheName;
/** holds failover and cluster information */
protected RemoteCacheAttributes remoteCacheAttributes;
+ /** A cache manager */
private ICompositeCacheManager cacheMgr;
/**
@@ -92,7 +98,7 @@
* @param cacheMgr
*/
public RemoteCacheNoWaitFacade( RemoteCacheNoWait[] noWaits, RemoteCacheAttributes rca,
- ICompositeCacheManager cacheMgr )
+ ICompositeCacheManager cacheMgr )
{
if ( log.isDebugEnabled() )
{
@@ -174,10 +180,37 @@
}
/**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ {
+ if ( keys != null && !keys.isEmpty() )
+ {
+ for ( int i = 0; i < noWaits.length; i++ )
+ {
+ try
+ {
+ return noWaits[i].getMultiple( keys );
+ }
+ catch ( Exception ex )
+ {
+ log.debug( "Failed to get." );
+ return new HashMap();
+ }
+ }
+ }
+
+ return new HashMap();
+ }
+
+ /**
* Gets the set of keys of objects currently in the group.
* <p>
* @param group
- * @return
+ * @return the set of keys of objects currently in the group
* @throws IOException
*/
public Set getGroupKeys( String group )
@@ -365,9 +398,8 @@
return getStatistics().toString();
}
- /*
- * (non-Javadoc)
- * @see org.apache.jcs.auxiliary.AuxiliaryCache#getStatistics()
+ /**
+ * @return statistics about the cache region
*/
public IStats getStatistics()
{
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/ZombieRemoteCacheService.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/ZombieRemoteCacheService.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/ZombieRemoteCacheService.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/ZombieRemoteCacheService.java Fri Apr 11 11:43:26 2008
@@ -22,6 +22,8 @@
import java.io.IOException;
import java.io.Serializable;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
@@ -147,6 +149,17 @@
{
// Zombies have no inner life
return null;
+ }
+
+ /**
+ * @param cacheName
+ * @param keys
+ * @param requesterId
+ * @return an empty map. zombies have no internal data
+ */
+ public Map getMultiple( String cacheName, Set keys, long requesterId )
+ {
+ return new HashMap();
}
/**
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/behavior/IRemoteCacheService.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/behavior/IRemoteCacheService.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/behavior/IRemoteCacheService.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/remote/behavior/IRemoteCacheService.java Fri Apr 11 11:43:26 2008
@@ -22,6 +22,7 @@
import java.io.IOException;
import java.io.Serializable;
import java.rmi.Remote;
+import java.util.Map;
import java.util.Set;
import org.apache.jcs.access.exception.ObjectExistsException;
@@ -34,7 +35,6 @@
public interface IRemoteCacheService
extends Remote, ICacheService
{
-
/**
* Puts a cache item to the cache.
* <p>
@@ -43,7 +43,7 @@
* @throws ObjectExistsException
* @throws IOException
*/
- public void update( ICacheElement item, long requesterId )
+ void update( ICacheElement item, long requesterId )
throws ObjectExistsException, IOException;
/**
@@ -54,7 +54,7 @@
* @param requesterId
* @throws IOException
*/
- public void remove( String cacheName, Serializable key, long requesterId )
+ void remove( String cacheName, Serializable key, long requesterId )
throws IOException;
/**
@@ -64,7 +64,7 @@
* @param requesterId
* @throws IOException
*/
- public void removeAll( String cacheName, long requesterId )
+ void removeAll( String cacheName, long requesterId )
throws IOException;
/**
@@ -80,7 +80,19 @@
* @return ICacheElement
* @throws IOException
*/
- public ICacheElement get( String cacheName, Serializable key, long requesterId )
+ ICacheElement get( String cacheName, Serializable key, long requesterId )
+ throws IOException;
+
+ /**
+ * 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
+ */
+ Map getMultiple( String cacheName, Set keys, long requesterId )
throws IOException;
/**
@@ -89,6 +101,6 @@
* @return A Set of keys
* @throws java.rmi.RemoteException
*/
- public Set getGroupKeys( String cacheName, String groupName )
+ Set getGroupKeys( String cacheName, String groupName )
throws java.rmi.RemoteException;
}
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=647264&r1=647263&r2=647264&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 Fri Apr 11 11:43:26 2008
@@ -68,27 +68,28 @@
extends UnicastRemoteObject
implements IRemoteCacheService, IRemoteCacheObserver, IRemoteCacheServiceAdmin, Unreferenced
{
+ /** For serialization. Don't change.*/
private static final long serialVersionUID = -8072345435941473116L;
+ /** log instance */
private final static Log log = LogFactory.getLog( RemoteCacheServer.class );
/** timing -- if we should record operation times. */
protected final static boolean timing = true;
+ /** Number of puts into the cache. */
private int puts = 0;
- // Maps cache name to CacheListeners object.
- // association of listeners (regions).
+ /** Maps cache name to CacheListeners object. association of listeners (regions). */
private final Hashtable cacheListenersMap = new Hashtable();
private final Hashtable clusterListenersMap = new Hashtable();
private CompositeCacheManager cacheManager;
- // relates listener id with a type
+ /** relates listener id with a type */
private final Hashtable idTypeMap = new Hashtable();
- // private transient int listenerId = 0;
private int[] listenerId = new int[1];
/** Configuration settings. */
@@ -103,7 +104,6 @@
* <p>
* @param rcsa
* @throws RemoteException
- * @exception IOException
*/
RemoteCacheServer( IRemoteCacheServerAttributes rcsa )
throws RemoteException
@@ -215,7 +215,6 @@
* <p>
* @param item
* @throws IOException
- *
*/
public void put( ICacheElement item )
throws IOException
@@ -223,10 +222,9 @@
update( item );
}
- /*
- * (non-Javadoc)
- *
- * @see org.apache.jcs.engine.behavior.ICacheService#update(org.apache.jcs.engine.behavior.ICacheElement)
+ /**
+ * @param item
+ * @throws IOException
*/
public void update( ICacheElement item )
throws IOException
@@ -266,7 +264,6 @@
public void update( ICacheElement item, long requesterId )
throws IOException
{
-
long start = 0;
if ( timing )
{
@@ -487,8 +484,8 @@
if ( log.isDebugEnabled() )
{
- log.debug( "get [" + key + "] from cache [" + cacheName + "] requesterId = [" + requesterId + "] remoteType = "
- + remoteTypeL );
+ log.debug( "get [" + key + "] from cache [" + cacheName + "] requesterId = [" + requesterId
+ + "] remoteType = " + remoteTypeL );
}
// Since a non-receiving remote cache client will not register a
@@ -538,7 +535,8 @@
{
if ( log.isDebugEnabled() )
{
- log.debug( "NonLocalGet. fromCluster [" + fromCluster + "] AllowClusterGet [" + this.rcsa.getAllowClusterGet() + "]" );
+ log.debug( "NonLocalGet. fromCluster [" + fromCluster + "] AllowClusterGet ["
+ + this.rcsa.getAllowClusterGet() + "]" );
}
element = c.get( key );
}
@@ -550,7 +548,8 @@
if ( log.isDebugEnabled() )
{
- log.debug( "LocalGet. fromCluster [" + fromCluster + "] AllowClusterGet [" + this.rcsa.getAllowClusterGet() + "]" );
+ log.debug( "LocalGet. fromCluster [" + fromCluster + "] AllowClusterGet ["
+ + this.rcsa.getAllowClusterGet() + "]" );
}
element = c.localGet( key );
}
@@ -559,6 +558,111 @@
}
/**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( String cacheName, Set keys )
+ throws IOException
+ {
+ return this.getMultiple( cacheName, keys, 0 );
+ }
+
+ /**
+ * 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
+ */
+ public Map getMultiple( String cacheName, Set keys, long requesterId )
+ throws IOException
+ {
+ Integer remoteTypeL = (Integer) idTypeMap.get( new Long( requesterId ) );
+
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "getMultiple [" + keys + "] from cache [" + cacheName + "] requesterId = [" + requesterId
+ + "] remoteType = " + remoteTypeL );
+ }
+
+ // Since a non-receiving remote cache client will not register a
+ // listener, it will not have a listener id assigned from the server. As
+ // such the remote server cannot determine if it is a cluster or a
+ // normal client. It will assume that it is a normal client.
+
+ boolean fromCluster = false;
+ if ( remoteTypeL != null && remoteTypeL.intValue() == IRemoteCacheAttributes.CLUSTER )
+ {
+ fromCluster = true;
+ }
+
+ CacheListeners cacheDesc = null;
+ try
+ {
+ cacheDesc = getCacheListeners( cacheName );
+ }
+ catch ( Exception e )
+ {
+ log.error( "Problem getting listeners.", e );
+ }
+
+ if ( cacheDesc == null )
+ {
+ return null;
+ }
+ CompositeCache c = (CompositeCache) cacheDesc.cache;
+
+ Map elements = null;
+
+ // 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() )
+ {
+ 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( "LocalGetMultiple. fromCluster [" + fromCluster + "] AllowClusterGet ["
+ + this.rcsa.getAllowClusterGet() + "]" );
+ }
+
+ elements = c.localGetMultiple( keys );
+ }
+
+ return elements;
+ }
+
+ /**
* Gets the set of keys of objects currently in the group.
* <p>
* @param cacheName
@@ -581,6 +685,7 @@
{
return Collections.EMPTY_SET;
}
+
CompositeCache c = (CompositeCache) cacheDesc.cache;
return c.getGroupKeys( group );
}
@@ -981,7 +1086,8 @@
* registered, it will be removed from the event queue map list.
* <p>
* @param cacheName
- * @param listenerId
+ * @param listener
+ * @throws IOException
*/
public void removeCacheListener( String cacheName, ICacheListener listener )
throws IOException
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/ZombieCacheService.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/ZombieCacheService.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/ZombieCacheService.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/ZombieCacheService.java Fri Apr 11 11:43:26 2008
@@ -20,6 +20,10 @@
*/
import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -58,14 +62,26 @@
// zombies have no inner life
}
- /*
- * (non-Javadoc)
- * @see org.apache.jcs.engine.behavior.ICacheService#get(java.lang.String,
- * java.io.Serializable)
- */
+ /**
+ * @param cacheName
+ * @param key
+ * @return null. zombies have no internal data
+ * */
public ICacheElement get( String cacheName, Serializable key )
{
return null;
+ }
+
+ /**
+ * Returns an empty map. Zombies have no internal data.
+ * <p>
+ * @param cacheName
+ * @param keys
+ * @return an empty map
+ */
+ public Map getMultiple( String cacheName, Set keys )
+ {
+ return new HashMap();
}
/**
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICache.java Fri Apr 11 11:43:26 2008
@@ -21,6 +21,8 @@
import java.io.IOException;
import java.io.Serializable;
+import java.util.Map;
+import java.util.Set;
/**
* This is the top level interface for all cache like structures. It defines the methods used
@@ -35,30 +37,40 @@
/**
* Puts an item to the cache.
* <p>
- * @param ce
+ * @param element
* @throws IOException
*/
- public void update( ICacheElement ce )
+ void update( ICacheElement element )
throws IOException;
/**
* Gets an item from the cache.
* <p>
* @param key
- * @return
+ * @return a cache element, or null if there is no data in cache for this key
* @throws IOException
*/
- public ICacheElement get( Serializable key )
+ ICacheElement get( Serializable key )
+ throws IOException;
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ Map getMultiple( Set keys )
throws IOException;
/**
* Removes an item from the cache.
* <p>
* @param key
- * @return
+ * @return false if there was an error in removal
* @throws IOException
*/
- public boolean remove( Serializable key )
+ boolean remove( Serializable key )
throws IOException;
/**
@@ -66,14 +78,14 @@
* <p>
* @throws IOException
*/
- public void removeAll()
+ void removeAll()
throws IOException;
/**
* Prepares for shutdown.
* @throws IOException
*/
- public void dispose()
+ void dispose()
throws IOException;
/**
@@ -81,26 +93,26 @@
* <p>
* @return number of elements
*/
- public int getSize();
+ int getSize();
/**
* Returns the cache status.
* <p>
* @return Alive or Error
*/
- public int getStatus();
+ int getStatus();
/**
* Returns the cache stats.
* <p>
* @return String of important historical information.
*/
- public String getStats();
+ String getStats();
/**
* Returns the cache name.
* <p>
* @return usually the region name.
*/
- public String getCacheName();
+ String getCacheName();
}
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheService.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheService.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheService.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ICacheService.java Fri Apr 11 11:43:26 2008
@@ -21,6 +21,8 @@
import java.io.IOException;
import java.io.Serializable;
+import java.util.Map;
+import java.util.Set;
import org.apache.jcs.access.exception.ObjectExistsException;
import org.apache.jcs.access.exception.ObjectNotFoundException;
@@ -40,7 +42,7 @@
* @throws ObjectExistsException
* @throws IOException
*/
- public void update( ICacheElement item )
+ void update( ICacheElement item )
throws ObjectExistsException, IOException;
/**
@@ -48,11 +50,23 @@
* <p>
* @param cacheName
* @param key
- * @return
+ * @return the ICacheElement or null if not found
* @throws ObjectNotFoundException
* @throws IOException
*/
- public ICacheElement get( String cacheName, Serializable key )
+ ICacheElement get( String cacheName, Serializable key )
+ throws ObjectNotFoundException, IOException;
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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 ObjectNotFoundException
+ * @throws IOException
+ */
+ Map getMultiple( String cacheName, Set keys )
throws ObjectNotFoundException, IOException;
/**
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCache.java Fri Apr 11 11:43:26 2008
@@ -22,6 +22,7 @@
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
@@ -64,8 +65,10 @@
public class CompositeCache
implements ICache, Serializable
{
+ /** For serialization. Don't change. */
private static final long serialVersionUID = -2838097410378294960L;
+ /** log instance */
private final static Log log = LogFactory.getLog( CompositeCache.class );
/**
@@ -74,12 +77,13 @@
*/
public static IElementEventQueue elementEventQ = new ElementEventQueue( "AllRegionQueue" );
- // Auxiliary caches.
+ /** Auxiliary caches. */
private AuxiliaryCache[] auxCaches = new AuxiliaryCache[0];
+ /** is this alive? */
private boolean alive = true;
- // this is in the cacheAttr, shouldn't be used, remove
+ /** TODO - this is in the cacheAttr, shouldn't be used, remove */
final String cacheName;
/** Region Elemental Attributes, default. */
@@ -88,9 +92,10 @@
/** Cache Attributes, for hub and memory auxiliary. */
private ICompositeCacheAttributes cacheAttr;
- // Statistics
+ /** How many times update was called. */
private int updateCount;
+ /** How many times remove was called. */
private int removeCount;
/** Memory cache hit count */
@@ -414,8 +419,7 @@
* Gets an item from the cache.
* <p>
* @param key
- * @return
- * @throws IOException
+ * @return element from the cache, or null if not present
* @see org.apache.jcs.engine.behavior.ICache#get(java.io.Serializable)
*/
public ICacheElement get( Serializable key )
@@ -515,9 +519,9 @@
{
element = aux.get( key );
}
- catch ( IOException ex )
+ catch ( IOException e )
{
- log.error( "Error getting from aux", ex );
+ log.error( "Error getting from aux", e );
}
}
@@ -526,10 +530,9 @@
log.debug( "Got CacheElement: " + element );
}
+ // Item found in one of the auxiliary caches.
if ( element != null )
{
- // Item found in one of the auxiliary caches.
-
if ( isExpired( element ) )
{
if ( log.isDebugEnabled() )
@@ -555,7 +558,6 @@
}
// Update counters
-
hitCountAux++;
auxHitCountByIndex[i]++;
@@ -603,6 +605,271 @@
}
/**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ {
+ return getMultiple( keys, false );
+ }
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * Do not try to go remote or laterally for this data.
+ * <p>
+ * @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
+ */
+ public Map localGetMultiple( Set keys )
+ {
+ return getMultiple( keys, true );
+ }
+
+ /**
+ * Look in memory, then disk, remote, or laterally for these items. The order is dependent on the
+ * order in the cache.ccf file. Keep looking in each cache location until either the element is found,
+ * or the method runs out of places to look.
+ * <p>
+ * Do not try to go remote or laterally for this get if it is localOnly. Otherwise try to go
+ * remote or lateral if such an auxiliary is configured for this region.
+ * <p>
+ * @param keys
+ * @param localOnly
+ * @return ICacheElement
+ */
+ protected Map getMultiple( Set keys, boolean localOnly )
+ {
+ Map elements = new HashMap();
+
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "get: key = " + keys + ", localOnly = " + localOnly );
+ }
+
+ try
+ {
+ // First look in memory cache
+ elements.putAll( getMultipleFromMemory( keys ) );
+
+ // If fewer than all items were found in memory, then keep looking.
+ if ( elements.size() != keys.size() )
+ {
+ Set remainingKeys = pruneKeysFound( keys, elements );
+ elements.putAll( getMultipleFromAuxiliaryCaches( remainingKeys, localOnly ) );
+ }
+ }
+ catch ( Exception e )
+ {
+ log.error( "Problem encountered getting elements.", e );
+ }
+
+ // if we didn't find all the elements, increment the miss count by the number of elements not found
+ if ( elements.size() != keys.size() )
+ {
+ missCountNotFound += ( keys.size() - elements.size() );
+
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( cacheName + " - " + ( keys.size() - elements.size() ) + " Misses" );
+ }
+ }
+
+ return elements;
+ }
+
+ /**
+ * Gets items for the keys in the set. Returns a map: key -> result.
+ * @param keys
+ * @return the elements found in the memory cache
+ * @throws IOException
+ */
+ private Map getMultipleFromMemory( Set keys )
+ throws IOException
+ {
+ Map elementsFromMemory = memCache.getMultiple( keys );
+
+ Iterator elementFromMemoryIterator = new HashMap( elementsFromMemory ).values().iterator();
+
+ while ( elementFromMemoryIterator.hasNext() )
+ {
+ ICacheElement element = (ICacheElement) elementFromMemoryIterator.next();
+
+ if ( element != null )
+ {
+ // Found in memory cache
+ if ( isExpired( element ) )
+ {
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( cacheName + " - Memory cache hit, but element expired" );
+ }
+
+ missCountExpired++;
+
+ remove( element.getKey() );
+ elementsFromMemory.remove( element.getKey() );
+ }
+ else
+ {
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( cacheName + " - Memory cache hit" );
+ }
+
+ // Update counters
+ hitCountRam++;
+ }
+ }
+ }
+ return elementsFromMemory;
+ }
+
+ /**
+ * If local invocation look in aux caches, even if not local look in disk auxiliaries.
+ * <p>
+ * @param keys
+ * @param localOnly
+ * @return the elements found in the auxiliary caches
+ * @throws IOException
+ */
+ private Map getMultipleFromAuxiliaryCaches( Set keys, boolean localOnly )
+ throws IOException
+ {
+ Map elements = new HashMap();
+ Set remainingKeys = new HashSet( keys );
+
+ for ( int i = 0; i < auxCaches.length; i++ )
+ {
+ AuxiliaryCache aux = auxCaches[i];
+
+ if ( aux != null )
+ {
+ Map elementsFromAuxiliary = new HashMap();
+
+ long cacheType = aux.getCacheType();
+
+ if ( !localOnly || cacheType == AuxiliaryCache.DISK_CACHE )
+ {
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "Attempting to get from aux [" + aux.getCacheName() + "] which is of type: "
+ + cacheType );
+ }
+
+ try
+ {
+ elementsFromAuxiliary.putAll( aux.getMultiple( remainingKeys ) );
+ }
+ catch ( IOException e )
+ {
+ log.error( "Error getting from aux", e );
+ }
+ }
+
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "Got CacheElements: " + elementsFromAuxiliary );
+ }
+
+ Iterator elementFromAuxiliaryIterator = new HashMap( elementsFromAuxiliary ).values().iterator();
+
+ while ( elementFromAuxiliaryIterator.hasNext() )
+ {
+ ICacheElement element = (ICacheElement) elementFromAuxiliaryIterator.next();
+
+ // Item found in one of the auxiliary caches.
+ if ( element != null )
+ {
+ if ( isExpired( element ) )
+ {
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( cacheName + " - Aux cache[" + i + "] hit, but element expired." );
+ }
+
+ missCountExpired++;
+
+ // This will tell the remotes to remove the item
+ // based on the element's expiration policy. The elements attributes
+ // associated with the item when it created govern its behavior
+ // everywhere.
+ remove( element.getKey() );
+ elementsFromAuxiliary.remove( element.getKey() );
+ }
+ else
+ {
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( cacheName + " - Aux cache[" + i + "] hit" );
+ }
+
+ // Update counters
+ hitCountAux++;
+ auxHitCountByIndex[i]++;
+
+ // Spool the item back into memory
+ // only spool if the mem cache size is greater
+ // than 0, else the item will immediately get put
+ // into purgatory
+ if ( memCache.getCacheAttributes().getMaxObjects() > 0 )
+ {
+ memCache.update( element );
+ }
+ else
+ {
+ if ( log.isDebugEnabled() )
+ {
+ log.debug( "Skipping memory update since no items are allowed in memory" );
+ }
+ }
+ }
+ }
+ }
+
+ elements.putAll( elementsFromAuxiliary );
+
+ if ( elements.size() == keys.size() )
+ {
+ break;
+ }
+ else
+ {
+ remainingKeys = pruneKeysFound( keys, elements );
+ }
+ }
+ }
+
+ return elements;
+ }
+
+ /**
+ * Returns a set of keys that were not found.
+ * <p>
+ * @param keys
+ * @param foundElements
+ * @return the original set of cache keys, minus any cache keys
+ * present in the map keys of the foundElements map
+ */
+ private Set pruneKeysFound( Set keys, Map foundElements )
+ {
+ Set remainingKeys = new HashSet( keys );
+
+ Iterator foundKeys = foundElements.keySet().iterator();
+
+ while ( foundKeys.hasNext() )
+ {
+ Serializable key = (Serializable) foundKeys.next();
+ remainingKeys.remove( key );
+ }
+
+ return remainingKeys;
+ }
+
+ /**
* Determine if the element has exceeded its max life.
* <p>
* @param element
@@ -697,7 +964,7 @@
* Removes an item from the cache.
* <p>
* @param key
- * @return
+ * @return true is it was removed
* @throws IOException
* @see org.apache.jcs.engine.behavior.ICache#remove(java.io.Serializable)
*/
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/AbstractMemoryCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/AbstractMemoryCache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/AbstractMemoryCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/AbstractMemoryCache.java Fri Apr 11 11:43:26 2008
@@ -21,6 +21,7 @@
import java.io.IOException;
import java.io.Serializable;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
@@ -54,8 +55,10 @@
public abstract class AbstractMemoryCache
implements MemoryCache, Serializable
{
+ /** log instance */
private final static Log log = LogFactory.getLog( AbstractMemoryCache.class );
+ /** default chunking size */
private static final int DEFAULT_CHUNK_SIZE = 2;
/** The region name. This defines a namespace of sorts. */
@@ -149,6 +152,39 @@
throws IOException;
/**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ public Map getMultiple( Set keys )
+ throws IOException
+ {
+ Map elements = new HashMap();
+
+ if ( keys != null && !keys.isEmpty() )
+ {
+ Iterator iterator = keys.iterator();
+
+ while ( iterator.hasNext() )
+ {
+ Serializable key = (Serializable) iterator.next();
+
+ ICacheElement element = get( key );
+
+ if ( element != null )
+ {
+ elements.put( key, element );
+ }
+ }
+ }
+
+ return elements;
+ }
+
+ /**
* Get an item from the cache without affecting its order or last access
* time
* @param key
@@ -200,9 +236,8 @@
}
}
- /*
- * (non-Javadoc)
- * @see org.apache.jcs.engine.memory.MemoryCache#getStatistics()
+ /**
+ * @return statistics about the cache
*/
public IStats getStatistics()
{
@@ -286,6 +321,10 @@
return this.cache;
}
+ /**
+ * @param groupName
+ * @return group keys
+ */
public Set getGroupKeys( String groupName )
{
GroupId groupId = new GroupId( getCacheName(), groupName );
@@ -313,10 +352,9 @@
class MyThreadFactory
implements ThreadFactory
{
-
- /*
- * (non-Javadoc)
- * @see EDU.oswego.cs.dl.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+ /**
+ * @param runner
+ * @return a new thread for the given Runnable
*/
public Thread newThread( Runnable runner )
{
Modified: jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/behavior/IMemoryCache.java
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/behavior/IMemoryCache.java?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/behavior/IMemoryCache.java (original)
+++ jakarta/jcs/trunk/src/java/org/apache/jcs/engine/memory/behavior/IMemoryCache.java Fri Apr 11 11:43:26 2008
@@ -22,6 +22,7 @@
import java.io.IOException;
import java.io.Serializable;
import java.util.Iterator;
+import java.util.Map;
import java.util.Set;
import org.apache.jcs.engine.behavior.ICacheElement;
@@ -29,26 +30,22 @@
import org.apache.jcs.engine.control.CompositeCache;
import org.apache.jcs.engine.stats.behavior.IStats;
-/**
- * For the framework. Insures methods a MemoryCache needs to access.
- *
- */
+/** For the framework. Insures methods a MemoryCache needs to access. */
public interface IMemoryCache
{
/**
* Initialize the memory cache
* <p>
- * @param cache
- * The cache (region) this memory store is attached to.
+ * @param cache The cache (region) this memory store is attached to.
*/
- public void initialize( CompositeCache cache );
+ void initialize( CompositeCache cache );
/**
* Destroy the memory cache
* <p>
* @throws IOException
*/
- public void dispose()
+ void dispose()
throws IOException;
/**
@@ -56,14 +53,14 @@
* <p>
* @return Element count
*/
- public int getSize();
+ int getSize();
/**
* Returns the historical and statistical data for a region's memory cache.
* <p>
* @return Statistics and Infor for the Memory Cache.
*/
- public IStats getStatistics();
+ IStats getStatistics();
/**
* Get an iterator for all elements in the memory cache. This should be
@@ -72,7 +69,7 @@
* <p>
* @return An iterator
*/
- public Iterator getIterator();
+ Iterator getIterator();
/**
* Get an Array of the keys for all elements in the memory cache.
@@ -82,7 +79,7 @@
* will be a problem if someone puts a 1,000,000 or so items in a
* region.
*/
- public Object[] getKeyArray();
+ Object[] getKeyArray();
/**
* Removes an item from the cache
@@ -93,7 +90,7 @@
* @exception IOException
* Description of the Exception
*/
- public boolean remove( Serializable key )
+ boolean remove( Serializable key )
throws IOException;
/**
@@ -102,7 +99,7 @@
* @exception IOException
* Description of the Exception
*/
- public void removeAll()
+ void removeAll()
throws IOException;
/**
@@ -116,7 +113,7 @@
* only 3, you will get 3.
* @throws IOException
*/
- public int freeElements( int numberToFree )
+ int freeElements( int numberToFree )
throws IOException;
/**
@@ -128,7 +125,18 @@
* @exception IOException
* Description of the Exception
*/
- public ICacheElement get( Serializable key )
+ ICacheElement get( Serializable key )
+ throws IOException;
+
+ /**
+ * Gets multiple items from the cache based on the given set of keys.
+ * <p>
+ * @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
+ */
+ Map getMultiple( Set keys )
throws IOException;
/**
@@ -141,7 +149,7 @@
* @exception IOException
* Description of the Exception
*/
- public ICacheElement getQuiet( Serializable key )
+ ICacheElement getQuiet( Serializable key )
throws IOException;
/**
@@ -152,7 +160,7 @@
* @exception IOException
* Description of the Exception
*/
- public void waterfal( ICacheElement ce )
+ void waterfal( ICacheElement ce )
throws IOException;
/**
@@ -163,7 +171,7 @@
* @exception IOException
* Description of the Exception
*/
- public void update( ICacheElement ce )
+ void update( ICacheElement ce )
throws IOException;
/**
@@ -171,7 +179,7 @@
* <p>
* @return The cacheAttributes value
*/
- public ICompositeCacheAttributes getCacheAttributes();
+ ICompositeCacheAttributes getCacheAttributes();
/**
* Sets the CacheAttributes of the region.
@@ -179,14 +187,14 @@
* @param cattr
* The new cacheAttributes value
*/
- public void setCacheAttributes( ICompositeCacheAttributes cattr );
+ void setCacheAttributes( ICompositeCacheAttributes cattr );
/**
* Gets the cache hub / region that uses the MemoryCache.
* <p>
* @return The cache value
*/
- public CompositeCache getCompositeCache();
+ CompositeCache getCompositeCache();
/**
* Gets the set of keys of objects currently in the group.
@@ -194,6 +202,5 @@
* @param group
* @return a Set of group keys.
*/
- public Set getGroupKeys( String group );
-
+ Set getGroupKeys( String group );
}
Modified: jakarta/jcs/trunk/src/test-conf/TestTCPLateralIssueRemoveCache.ccf
URL: http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/test-conf/TestTCPLateralIssueRemoveCache.ccf?rev=647264&r1=647263&r2=647264&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/test-conf/TestTCPLateralIssueRemoveCache.ccf (original)
+++ jakarta/jcs/trunk/src/test-conf/TestTCPLateralIssueRemoveCache.ccf Fri Apr 11 11:43:26 2008
@@ -36,8 +36,8 @@
# simple Lateral TCP auxiliary
jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.socket.tcp.LateralTCPCacheFactory
jcs.auxiliary.LTCP.attributes=org.apache.jcs.auxiliary.lateral.socket.tcp.TCPLateralCacheAttributes
-jcs.auxiliary.LTCP.attributes.TcpServers=localhost:1111
-jcs.auxiliary.LTCP.attributes.TcpListenerPort=1110
+jcs.auxiliary.LTCP.attributes.TcpServers=localhost:1117
+jcs.auxiliary.LTCP.attributes.TcpListenerPort=1118
jcs.auxiliary.LTCP.attributes.AllowGet=false
jcs.auxiliary.LTCP.attributes.IssueRemoveOnPut=true
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.