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

时间:2019-08-04 02:49:11

标签: java jcache jsr107

我故意在类路径中有几个不同的缓存提供程序。我有用于分布式缓存的Hazelcast和用于本地缓存的Caffeine。我正在尝试使用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 可以与1个缓存提供程序一起使用吗? CacheLookupUtil类将字段@Inject放入所有注释处理器中。

我是覆盖所有拦截器(并提供自定义拦截器)并创建自己的CacheLookupUtil实现的唯一选择吗?还是我可以做些其他事情?

1 个答案:

答案 0 :(得分:1)

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

您需要激活注释处理器的自定义缓存提供程序。像这样:

@CacheDefaults(cacheResolverFactory=LocalCacheResolver.class)
public class SomeService {
  // methods with caching annotations
}

关于RI注释的注释:我对用法有不同的感觉。通常,它是JCache标准的参考实现的一部分。整个JCache参考实现(RI)并不打算在生产中使用,而是为了验证标准而创建的。 Greg Luck早在2014年就使用RI的注释处理进行了传播,请参见:How JSR107 Caching Annotations are meant to be used。但是,这只是在其他相关实现可用之前的一种中间解决方案。