example ejemplo data cachemanager cacheable baeldung java spring ehcache

java - data - ehcache spring ejemplo



Usando EhCache en Spring 4 sin XML (2)

Configuración sin XML de EhCache en Spring

@Configuration @EnableCaching public class CachingConfig implements CachingConfigurer { @Bean(destroyMethod="shutdown") public net.sf.ehcache.CacheManager ehCacheManager() { CacheConfiguration cacheConfiguration = new CacheConfiguration(); cacheConfiguration.setName("myCacheName"); cacheConfiguration.setMemoryStoreEvictionPolicy("LRU"); cacheConfiguration.setMaxEntriesLocalHeap(1000); net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration(); config.addCache(cacheConfiguration); return net.sf.ehcache.CacheManager.newInstance(config); } @Bean @Override public CacheManager cacheManager() { return new EhCacheCacheManager(ehCacheManager()); } @Bean @Override public KeyGenerator keyGenerator() { return new SimpleKeyGenerator(); } @Bean @Override public CacheResolver cacheResolver() { return new SimpleCacheResolver(); } @Bean @Override public CacheErrorHandler errorHandler() { return new SimpleCacheErrorHandler(); } }

Como alternativa para la prueba, puede usar un simple ConcurrentMapCache ejecutándose sin XML como se muestra a continuación.

@Configuration @EnableCaching public class CachingConfig implements CachingConfigurer { @Bean @Override public CacheManager cacheManager() { SimpleCacheManager cacheManager = new SimpleCacheManager(); List<Cache> caches = new ArrayList<Cache>(); caches.add(new ConcurrentMapCache("myCacheName")); cacheManager.setCaches(caches); return cacheManager; } @Bean @Override public KeyGenerator keyGenerator() { return new SimpleKeyGenerator(); } @Bean @Override public CacheResolver cacheResolver() { return new SimpleCacheResolver(); } @Bean @Override public CacheErrorHandler errorHandler() { return new SimpleCacheErrorHandler(); } }

Edición: actualizado para agregar el método de apagado en la memoria caché subyacente Edición: se agregó la configuración para el controlador de errores y la resolución de la memoria caché

¿Hay alguna manera de inicializar EhCache sin xml en Spring 4 o con Spring Boot?

Noté que Spring Boot 1.0.0.RC3 no tiene ninguna dependencia de ehcache pero la publicación de la versión Spring 4.0GA mencionó que ha mejorado el soporte para EhCache. Además, Spring 3 tenía la clase org.springframework.cache.ehcache.EhCacheCacheManager pero eso ya no forma parte de las dependencias.

Edición: Spring 4 tiene soporte para EhCache. Debes añadir la dependencia:

<groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId>

Edit2: He intentado lo siguiente y creo que estoy cerca, pero recibo un error:

@Bean @Override public CacheManager cacheManager() { CacheConfiguration cacheConfiguration = new CacheConfiguration(); cacheConfiguration.setName("primary"); cacheConfiguration.setMemoryStoreEvictionPolicy("LRU"); cacheConfiguration.setMaxEntriesLocalHeap(0); net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration(); config.addCache(cacheConfiguration); net.sf.ehcache.CacheManager cacheManager = new net.sf.ehcache.CacheManager(config); cacheManager.setName("EhCache"); return new EhCacheCacheManager(cacheManager); } @Bean public EhCacheManagerFactoryBean factoryBean() { return new EhCacheManagerFactoryBean(); }

Error

Caused by: net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following: 1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary 2. Shutdown the earlier cacheManager before creating new one with same name. The source of the existing CacheManager is: [Programmatically configured] at net.sf.ehcache.CacheManager.assertNoCacheManagerExistsWithSameName(CacheManager.java:590) at net.sf.ehcache.CacheManager.init(CacheManager.java:384) at net.sf.ehcache.CacheManager.<init>(CacheManager.java:263) at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:166) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549) ... 15 more


Lo hago en dos niveles de abstracción, un archivo de configuración por tecnología (Ehcache, Redis, etc.) y un archivo de configuración general.

Aquí está el de Ehcache (Redis sería similar):

@Configuration public class EhCacheConfiguration { @Bean public EhCacheCacheManager ehCacheCacheManager() { return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject()); } @Bean public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean(); cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); cacheManagerFactoryBean.setShared(true); return cacheManagerFactoryBean; } }

Y aquí está el general (completo con ganchos Redis):

@Configuration @EnableCaching public class CachingConfiguration implements CachingConfigurer { @Qualifier("ehCacheCacheManager") @Autowired(required = false) private CacheManager ehCacheCacheManager; @Qualifier("redisCacheManager") @Autowired(required = false) private CacheManager redisCacheManager; @Bean @Override public CacheManager cacheManager() { List<CacheManager> cacheManagers = Lists.newArrayList(); if (this.ehCacheCacheManager != null) { cacheManagers.add(this.ehCacheCacheManager); } if (this.redisCacheManager != null) { cacheManagers.add(this.redisCacheManager); } CompositeCacheManager cacheManager = new CompositeCacheManager(); cacheManager.setCacheManagers(cacheManagers); cacheManager.setFallbackToNoOpCache(false); return cacheManager; } @Bean @Override public KeyGenerator keyGenerator() { return new DefaultKeyGenerator(); } }