繁体   English   中英

如何在多个模块/项目中配置多个缓存管理器 spring cache java

[英]How to have multiple cache manager configuration in multiple modules/projects spring cache java

目前有两个不同的模块让我们说项目 A 和项目 B。项目 B 导入/使用到/在项目 A 中。目前项目 B 已经有 CacheManager。

项目B

  public class CacheConfig {

  @Bean 
  public CacheManager cacheManager() {

  // using SimpleCacheManager()

  }
 }

但现在计划在项目 A 中实现 CacheManager 用于其他目的。

class SomeCacheConfig{

@Bean 
public CacheManager someCacheManager(){
 // using SimpleCacheManager() 
}

}

加载应用程序时抛出以下异常。

 java.lang.IllegalStateException: No CacheResolver specified, and no unique bean of type CacheManager found. Mark one as primary (or give it the name 'cacheManager') or declare a specific CacheManager to use, that serves as the default one.

你能帮我如何在多个模块/项目中实现多个 cacheManager 吗?

好吧。 将 @Primary 放在将用作默认值的 CacheManager bean 上。

@Primary
@Bean(name = "primaryCacheManager")
public CacheManager primaryCacheManager() {
    return new SimpleCacheManager();
}


@Bean(name = "myCacheManager")
public CacheManager myCacheManager() {
    return new SimpleCacheManager();
}

当您想使用另一个(即不是默认值)时,使用@Qualifier 注释显式定义 CacheManager bean 的名称。

@Autowired
@Qualifier("myCacheManager")
private CacheManager myCacheManager;

或者,如果您使用基于注解的 Spring Cache 实现,您还可以定义一个 CacheManager 名称作为这些注解的属性

@Cacheable(value = "some",cacheManager = "myCacheManager")
public String getSome(){
    return "";
}

您可以使用 Spring 提供的 CompositeCacheManager 实现( https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/support/CompositeCacheManager.html

这允许您编写缓存管理器列表。 复合管理器将遍历列表并在它存在的第一个管理器中获取缓存。请注意“注意:此复合管理器委托的常规 CacheManagers 如果不知道指定的缓存名称,允许迭代到下一个委托。然而,一旦请求,大多数 CacheManager 实现会回退到命名缓存的延迟创建;如果可用,请查看具有固定缓存名称的“静态”模式的特定配置详细信息。”

Erik Ahlswede 建议的最终对我有用的方法

@Bean
public CacheManager cacheManager() {
    return new CompositeCacheManager(
            new ConcurrentMapCacheManager("cacheA") {
                @Override
                protected Cache createConcurrentMapCache(final String name) {
                    return new ConcurrentMapCache(name,
                            CacheBuilder.newBuilder()
                                    .expireAfterWrite(CACHE_TTL_IN_SECONDS, TimeUnit.SECONDS)
                                    .maximumSize(MAX_ENTRIES_IN_CACHE)
                                    .build().asMap(), false);
                }
            },
            new ConcurrentMapCacheManager("cacheB") {

                @Override
                protected Cache createConcurrentMapCache(final String name) {
                    return new ConcurrentMapCache(name,
                            CacheBuilder.newBuilder()
                                    .expireAfterWrite(CACHE_TTL_IN_SECONDS, TimeUnit.SECONDS)
                                    .maximumSize(MAX_ENTRIES_IN_CACHE)
                                    .build().asMap(), false);
                }
            }
    );
}

然后使用它

@Cacheable(cacheNames = "someComplicatedAction", cacheManager = "cacheA")
public String someComplicatedAction() {

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM