我有意在我的类路径中有两个不同的缓存提供程序。我有分散缓存的Hazelcast和本地缓存的咖啡因。我试图使用JCache (JSR107)注释来缓存我的值。
我已经创建了一个CacheResolverFactory,它将能够检测要从哪个提供程序中使用哪个缓存管理器(基于方法注释),但是当我启动应用程序时,会收到以下错误消息:
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。
public class CacheLookupUtil extends AbstractCacheLookupUtil<InvocationContext> {
@Inject
private BeanManagerUtil beanManagerUtil;
private CacheKeyGenerator defaultCacheKeyGenerator = new DefaultCacheKeyGenerator();
private CacheResolverFactory defaultCacheResolverFactory = new DefaultCacheResolverFactory();
...
...
}我能做些什么来回避这个问题吗?JCache只能与一个缓存提供程序一起使用吗?CacheLookupUtil类被字段@Inject编辑到所有注释处理器中。
我唯一的选择是覆盖所有拦截器(并提供自定义拦截器)并创建自己的CacheLookupUtil实现?或者我还能做点什么呢?
发布于 2019-08-05 09:55:44
JCache支持多个缓存提供程序。
您需要激活注释处理器的自定义缓存提供程序。如下所示:
@CacheDefaults(cacheResolverFactory=LocalCacheResolver.class)
public class SomeService {
// methods with caching annotations
}关于RI注释的注意事项:我对这个用法有着复杂的感觉。一般来说,它的一部分是JCache标准的参考实现。整个JCache参考实现(RI)并不打算用于生产,而是用来验证标准的。使用RI的注释处理在2014年由Greg在这里传播,参见:如何使用JSR107缓存注释。然而,在相关的其他实现可用之前,这意味着作为一个中间解决方案。
https://stackoverflow.com/questions/57343430
复制相似问题