gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:01:38 29 4
gpt4 key购买 nike

我故意在我的类路径中有几个不同的缓存提供程序。我有用于分布式缓存的 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 类有一个私有(private)的 CacheResolverFactory 成员,它在构造时被初始化为 DefaultCacheResolverFactory(),它需要一个 CacheProvider。

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

有什么办法可以避免这个问题吗? JCache ONLY 可以与 1 个缓存提供程序一起使用吗? CacheLookupUtil 类是字段 @Injected 到所有注释处理器中。

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

最佳答案

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 .但是,这意味着在相关的其他实现可用之前作为中间解决方案。

关于java - 具有多个缓存提供程序的 JCache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57343430/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com