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

Eri*_* B. 5 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)
Run Code Online (Sandbox Code Playgroud)

显然,我知道我有多个缓存提供程序。但是,我似乎无法找到有关此问题的任何信息。该类org.jsr107.ri.annotations.cdi.CacheLookupUtil有一个私有 CacheResolverFactory 成员,该成员在构造时初始化为需要单个 CacheProvider 的 DefaultCacheResolverFactory()。

public class CacheLookupUtil extends AbstractCacheLookupUtil<InvocationContext> {
    @Inject
    private BeanManagerUtil beanManagerUtil;
    private CacheKeyGenerator defaultCacheKeyGenerator = new DefaultCacheKeyGenerator();
    private CacheResolverFactory defaultCacheResolverFactory = new DefaultCacheResolverFactory();
...
...
}
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来避免这个问题吗?JCache只能与 1 个缓存提供程序一起使用吗?并且该类CacheLookupUtil被现场@Inject编辑到所有注释处理器中。

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

cru*_*tex 1

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

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

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

Run Code Online (Sandbox Code Playgroud)

关于 RI 注释的注意事项:我对其用法有复杂的感受。一般来说,它是 JCache 标准参考实现的一部分。整个 JCache 参考实现 (RI) 并非旨在用于生产,而是为了验证标准而创建的。Greg Luck 早在 2014 年就在此处传播了使用 RI 的注释处理,请参阅:How JSR107 Caching Annotations aremeaned to be use。然而,这只是在相关其他实现可用之前作为中间解决方案。