如何配置Ehcache 3集群JCache并获取javax.cache.CacheManager
如何获取具备集群能力的javax.cache.CacheManager?
按照Ehcache官方文档创建集群缓存时,得到的是实现org.ehcache.CacheManager的PersistentCacheManager,但我的Spring 6应用需要的是javax.cache.CacheManager。在Ehcache JSR107文档中未找到关于集群的明确说明,请问如何获取具备集群能力的javax.cache.CacheManager?
原集群CacheManager配置示例代码:
CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder = CacheManagerBuilder.newCacheManagerBuilder() .with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application")) .autoCreateOnReconnect(c -> c)); PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true);
解决方案
Ehcache的JSR-107(JCache)实现完全支持集群模式,你可以通过两种方式获取具备集群能力的javax.cache.CacheManager:
方式一:直接通过JCache API配置集群
通过CachingProvider传入集群相关属性来创建JCache管理器:
import javax.cache.CacheManager; import javax.cache.Caching; import javax.cache.spi.CachingProvider; import java.util.HashMap; import java.util.Map; // 获取Ehcache的JCache提供器 CachingProvider cachingProvider = Caching.getCachingProvider(); // 配置集群连接属性 Map<String, Object> clusterProps = new HashMap<>(); // 指定Terracotta集群地址 clusterProps.put("org.ehcache.cluster.uri", "terracotta://localhost/my-application"); // 配置重连时自动创建集群资源 clusterProps.put("org.ehcache.cluster.auto-create", "true"); // 创建具备集群能力的JCache CacheManager CacheManager jCacheManager = cachingProvider.getCacheManager(null, null, clusterProps);
方式二:基于已有Ehcache集群管理器转换
如果你已经构建了Ehcache的PersistentCacheManager,可以将其适配为JCache的CacheManager:
import org.ehcache.CacheManagerBuilder; import org.ehcache.clustered.ClusteringServiceConfigurationBuilder; import org.ehcache.spi.persistence.PersistentCacheManager; import javax.cache.CacheManager; import javax.cache.Caching; import javax.cache.spi.CachingProvider; import java.net.URI; // 先构建Ehcache集群PersistentCacheManager CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder = CacheManagerBuilder.newCacheManagerBuilder() .with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application")) .autoCreateOnReconnect(c -> c)); PersistentCacheManager ehcacheManager = clusteredCacheManagerBuilder.build(true); // 获取JCache提供器并转换 CachingProvider cachingProvider = Caching.getCachingProvider(); CacheManager jCacheManager = cachingProvider.getCacheManager(ehcacheManager.getURI(), null);
注意事项
- 确保Terracotta集群服务器已启动,且地址配置正确
- 项目依赖需包含Ehcache集群和JCache模块(以Maven为例):
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache-clustered</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache-jcache</artifactId> <version>3.10.0</version> </dependency>
内容的提问来源于stack exchange,提问作者Selaron
相关产品推荐
相关产品推荐

