diff --git a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java index 478d5d1b..d44e138c 100644 --- a/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/CacheFactoryBean.java @@ -41,21 +41,26 @@ import com.gemstone.gemfire.cache.CacheFactory; import com.gemstone.gemfire.cache.GemFireCache; import com.gemstone.gemfire.distributed.DistributedMember; import com.gemstone.gemfire.distributed.DistributedSystem; +import com.gemstone.gemfire.internal.cache.GemFireCacheImpl; import com.gemstone.gemfire.pdx.PdxSerializable; import com.gemstone.gemfire.pdx.PdxSerializer; /** - * Factory used for configuring a Gemfire Cache manager. Allows either retrieval of an existing, opened cache - * or the creation of a new one. - - *

This class implements the {@link org.springframework.dao.support.PersistenceExceptionTranslator} + * Factory used for configuring a Gemfire Cache manager. Allows either retrieval + * of an existing, opened cache or the creation of a new one. + * + *

+ * This class implements the + * {@link org.springframework.dao.support.PersistenceExceptionTranslator} * interface, as auto-detected by Spring's - * {@link org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor}, - * for AOP-based translation of native exceptions to Spring DataAccessExceptions. - * Hence, the presence of this class automatically enables - * a PersistenceExceptionTranslationPostProcessor to translate GemFire exceptions. + * {@link org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor} + * , for AOP-based translation of native exceptions to Spring + * DataAccessExceptions. Hence, the presence of this class automatically enables + * a PersistenceExceptionTranslationPostProcessor to translate GemFire + * exceptions. * * @author Costin Leau + * @author David Turanski */ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanClassLoaderAware, DisposableBean, InitializingBean, FactoryBean, PersistenceExceptionTranslator { @@ -67,12 +72,13 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl */ private class PdxOptions implements Runnable { - private CacheFactory factory; + private final CacheFactory factory; PdxOptions(CacheFactory factory) { this.factory = factory; } + @Override public void run() { if (pdxSerializer != null) { Assert.isAssignable(PdxSerializer.class, pdxSerializer.getClass(), "Invalid pdx serializer used"); @@ -93,24 +99,70 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } } + private class InternalCacheOptions implements Runnable { + private final GemFireCacheImpl cacheImpl; + + InternalCacheOptions(GemFireCache cache) { + this.cacheImpl = (GemFireCacheImpl) cache; + } + + @Override + public void run() { + if (lockLease != null) { + cacheImpl.setLockLease(lockLease); + } + if (lockTimeout != null) { + cacheImpl.setLockTimeout(lockTimeout); + } + if (searchTimeout != null) { + cacheImpl.setSearchTimeout(searchTimeout); + } + if (messageSyncInterval != null) { + cacheImpl.setMessageSyncInterval(messageSyncInterval); + } + } + } + protected final Log log = LogFactory.getLog(getClass()); private GemFireCache cache; + private Resource cacheXml; + private Properties properties; + private ClassLoader beanClassLoader; + private GemfireBeanFactoryLocator factoryLocator; private BeanFactory beanFactory; + private String beanName; + private boolean useBeanFactoryLocator = true; + // PDX options protected Object pdxSerializer; + protected Boolean pdxPersistent; + protected Boolean pdxReadSerialized; + protected Boolean pdxIgnoreUnreadFields; + protected String pdxDiskStoreName; + protected Boolean copyOnRead; + + protected Integer lockTimeout; + + protected Integer lockLease; + + protected Integer messageSyncInterval; + + protected Integer searchTimeout; + + @Override public void afterPropertiesSet() throws Exception { // initialize locator if (useBeanFactoryLocator) { @@ -132,7 +184,8 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl try { cache = fetchCache(); msg = "Retrieved existing"; - } catch (CacheClosedException ex) { + } + catch (CacheClosedException ex) { Object factory = createFactory(cfgProps); // GemFire 6.6 specific options @@ -147,6 +200,11 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl cache = createCache(factory); msg = "Created"; } + if (this.copyOnRead != null) { + cache.setCopyOnRead(this.copyOnRead); + } + + applyInternalCacheOptions(); DistributedSystem system = cache.getDistributedSystem(); DistributedMember member = system.getDistributedMember(); @@ -163,15 +221,15 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl log.debug("Initialized cache from " + cacheXml); } - - } finally { + } + finally { th.setContextClassLoader(oldTCCL); } } /** - * Sets the PDX properties for the given object. Note this is implementation specific as it depends on the type - * of the factory passed in. + * Sets the PDX properties for the given object. Note this is implementation + * specific as it depends on the type of the factory passed in. * * @param factory */ @@ -181,6 +239,10 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } } + protected void applyInternalCacheOptions() { + new InternalCacheOptions(cache).run(); + } + protected Object createFactory(Properties props) { return new CacheFactory(props); } @@ -198,6 +260,7 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl return cfgProps; } + @Override public void destroy() throws Exception { if (cache != null && !cache.isClosed()) { cache.close(); @@ -211,6 +274,7 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } } + @Override public DataAccessException translateExceptionIfPossible(RuntimeException ex) { if (ex instanceof GemFireException) { return GemfireCacheUtils.convertGemfireAccessException((GemFireException) ex); @@ -226,26 +290,32 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl return null; } + @Override public GemFireCache getObject() throws Exception { return cache; } + @Override public Class getObjectType() { return (cache != null ? cache.getClass() : Cache.class); } + @Override public boolean isSingleton() { return true; } + @Override public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = classLoader; } + @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } + @Override public void setBeanName(String name) { this.beanName = name; } @@ -269,9 +339,11 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Indicates whether a bean factory locator is enabled (default) for this cache definition or not. The locator stores - * the enclosing bean factory reference to allow auto-wiring of Spring beans into GemFire managed classes. Usually disabled - * when the same cache is used in multiple application context/bean factories inside the same VM. + * Indicates whether a bean factory locator is enabled (default) for this + * cache definition or not. The locator stores the enclosing bean factory + * reference to allow auto-wiring of Spring beans into GemFire managed + * classes. Usually disabled when the same cache is used in multiple + * application context/bean factories inside the same VM. * * @param usage true if the bean factory locator is used underneath or not */ @@ -280,8 +352,9 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Sets the {@link PdxSerializable} for this cache. Applicable on GemFire 6.6 or higher. - * The argument is of type object for compatibility with GemFire 6.5. + * Sets the {@link PdxSerializable} for this cache. Applicable on GemFire + * 6.6 or higher. The argument is of type object for compatibility with + * GemFire 6.5. * * @param serializer pdx serializer configured for this cache. */ @@ -290,8 +363,9 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Sets the object preference to PdxInstance type. Applicable on GemFire 6.6 or higher. - * + * Sets the object preference to PdxInstance type. Applicable on GemFire 6.6 + * or higher. + * * @param pdxPersistent the pdxPersistent to set */ public void setPdxPersistent(Boolean pdxPersistent) { @@ -299,7 +373,8 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Controls whether the type metadata for PDX objects is persisted to disk. Applicable on GemFire 6.6 or higher. + * Controls whether the type metadata for PDX objects is persisted to disk. + * Applicable on GemFire 6.6 or higher. * * @param pdxReadSerialized the pdxReadSerialized to set */ @@ -308,7 +383,8 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Controls whether pdx ignores fields that were unread during deserialization. Applicable on GemFire 6.6 or higher. + * Controls whether pdx ignores fields that were unread during + * deserialization. Applicable on GemFire 6.6 or higher. * * @param pdxIgnoreUnreadFields the pdxIgnoreUnreadFields to set */ @@ -317,8 +393,9 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl } /** - * Set the disk store that is used for PDX meta data. Applicable on GemFire 6.6 or higher. - * + * Set the disk store that is used for PDX meta data. Applicable on GemFire + * 6.6 or higher. + * * @param pdxDiskStoreName the pdxDiskStoreName to set */ public void setPdxDiskStoreName(String pdxDiskStoreName) { @@ -331,4 +408,25 @@ public class CacheFactoryBean implements BeanNameAware, BeanFactoryAware, BeanCl protected BeanFactory getBeanFactory() { return beanFactory; } + + public void setCopyOnRead(boolean copyOnRead) { + this.copyOnRead = copyOnRead; + } + + public void setLockTimeout(int lockTimeout) { + this.lockTimeout = lockTimeout; + } + + public void setLockLease(int lockLease) { + this.lockLease = lockLease; + } + + public void setMessageSyncInterval(int messageSyncInterval) { + this.messageSyncInterval = messageSyncInterval; + } + + public void setSearchTimeout(int searchTimeout) { + this.searchTimeout = searchTimeout; + } + } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java index 357306c7..1b22964d 100644 --- a/src/main/java/org/springframework/data/gemfire/config/CacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/CacheParser.java @@ -50,6 +50,11 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { ParsingUtils.setPropertyValue(element, builder, "pdx-read-serialized", "pdxReadSerialized"); ParsingUtils.setPropertyValue(element, builder, "pdx-ignore-unread-fields", "pdxIgnoreUnreadFields"); ParsingUtils.setPropertyValue(element, builder, "use-bean-factory-locator", "useBeanFactoryLocator"); + ParsingUtils.setPropertyValue(element, builder, "copy-on-read", "copyOnRead"); + ParsingUtils.setPropertyValue(element, builder, "lock-timeout", "lockTimeout"); + ParsingUtils.setPropertyValue(element, builder, "lock-lease", "lockLease"); + ParsingUtils.setPropertyValue(element, builder, "message-sync-interval", "messageSyncInterval"); + ParsingUtils.setPropertyValue(element, builder, "search-timeout", "searchTimeout"); } @Override