首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个缓存提供程序的JCache?

具有多个缓存提供程序的JCache?
EN

Stack Overflow用户
提问于 2019-08-04 02:49:11
回答 1查看 1.9K关注 0票数 4

我有意在我的类路径中有两个不同的缓存提供程序。我有分散缓存的Hazelcast和本地缓存的咖啡因。我试图使用JCache (JSR107)注释来缓存我的值。

我已经创建了一个CacheResolverFactory,它将能够检测要从哪个提供程序中使用哪个缓存管理器(基于方法注释),但是当我启动应用程序时,会收到以下错误消息:

代码语言:javascript
复制
Exception in thread "Thread-2" javax.cache.CacheException: Multiple CachingProviders have been configured when only a single CachingProvider is expected
    at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:386)
    at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:361)
    at javax.cache.Caching.getCachingProvider(Caching.java:151)
    at org.jsr107.ri.annotations.DefaultCacheResolverFactory.<init>(DefaultCacheResolverFactory.java:59)
    at org.jsr107.ri.annotations.cdi.CacheLookupUtil.<init>(CacheLookupUtil.java:45)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

显然,我知道我有多个缓存提供程序。不过,无论如何,我似乎都找不到这个问题。org.jsr107.ri.annotations.cdi.CacheLookupUtil类有一个私有CacheResolverFactory成员,它在构造时初始化为DefaultCacheResolverFactory(),后者需要一个CacheProvider。

代码语言:javascript
复制
public class CacheLookupUtil extends AbstractCacheLookupUtil<InvocationContext> {
    @Inject
    private BeanManagerUtil beanManagerUtil;
    private CacheKeyGenerator defaultCacheKeyGenerator = new DefaultCacheKeyGenerator();
    private CacheResolverFactory defaultCacheResolverFactory = new DefaultCacheResolverFactory();
...
...
}

我能做些什么来回避这个问题吗?JCache只能与一个缓存提供程序一起使用吗?CacheLookupUtil类被字段@Inject编辑到所有注释处理器中。

我唯一的选择是覆盖所有拦截器(并提供自定义拦截器)并创建自己的CacheLookupUtil实现?或者我还能做点什么呢?

EN

回答 1

Stack Overflow用户

发布于 2019-08-05 09:55:44

JCache支持多个缓存提供程序。

您需要激活注释处理器的自定义缓存提供程序。如下所示:

代码语言:javascript
复制
@CacheDefaults(cacheResolverFactory=LocalCacheResolver.class)
public class SomeService {
  // methods with caching annotations
}

关于RI注释的注意事项:我对这个用法有着复杂的感觉。一般来说,它的一部分是JCache标准的参考实现。整个JCache参考实现(RI)并不打算用于生产,而是用来验证标准的。使用RI的注释处理在2014年由Greg在这里传播,参见:如何使用JSR107缓存注释。然而,在相关的其他实现可用之前,这意味着作为一个中间解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57343430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档