Как расширить стандартную конфигурацию Spring Boot CacheManager
Я использую поддержку кэширования Spring Boot в своем веб-приложении и устанавливаю Caffeine в качестве поставщика кеша.
У меня есть несколько кэшей в моем проекте, большинство из них имеют общую конфигурацию, но для двух конкретных кэшей мне нужно установить разные параметры.
В моем application.properties
У меня есть что-то похожее:
spring.cache.cache-names=a-cache,b-cache,c-cache, ...
spring.cache.caffeine.spec=maximumSize=200,expireAfterWrite=3600s
Это для обычных кешей. Затем я хотел бы расширить эту конфигурацию с помощью пользовательских параметров.
Этот пост объясняет, как настроить кеши с помощью @Configuration
класс, но с помощью этого метода я полностью переопределить общую конфигурацию.
Что мне нужно, это что-то вроде:
@Configuration
public class CacheConfiguration {
@Autowired
private CacheManager cacheManager;
@Bean
public CacheManager cacheManager(Ticker ticker) {
CaffeineCache c1 = new CaffeineCache("my-custom-cache", Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(400)
.build());
// ...
cacheManager.setCaches(Arrays.asList(..., c1, ... )); // here I'd like to add custom caches...
return cacheManager;
}
}
Но объявляя новый CacheManager
боб, "оригинал" cacheManager
не подключен автоматически
Есть ли способ реализовать то, что мне нужно?
0 ответов
Я использовал CompositeCacheManager для обработки этой ситуации. По сути, я создаю свои настроенные CaffeineCaches и помещаю их в SimpleCacheManager, затем использую CaffeineCacheManager с моими настройками по умолчанию. Я поместил оба менеджера кэша в CompositeCacheManager, и Spring сначала будет искать соответствующий кэш в моем SimpleCacheManager, а если он не найден, он будет искать в CaffeineCacheManager. Если CaffeineCacheManager также не имеет соответствия, он создаст новый кэш с настройками по умолчанию.
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
private static final Logger logger = LoggerFactory.getLogger(CacheConfig.class);
@Autowired
private MyCacheProperties myCacheProperties;
@Bean
@Override
public CacheManager cacheManager() {
// create a custom configured cache for each of the customCacheSpecs in the myCacheProperties
final List<CaffeineCache> customCaches = myCacheProperties.getCustomCacheSpecs().entrySet().stream()
.map(entry -> buildCache(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
// put the custom caches in a SimpleCacheManager
final SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
simpleCacheManager.setCaches(customCaches);
// create a Caffeine Cache manager based on the defaultCacheSpec in the myCacheProperties
final CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
caffeineCacheManager.setCacheSpecification(myCacheProperties.getDefaultCacheSpec());
caffeineCacheManager.setAllowNullValues(false);
// create a CompositeCacheManager which will first look for a customized cache from the simpleCacheManager and then
// if no cache is found it will delegate to the caffeineCacheManager. If the caffeineCacheManager already has
// created an appropriate cache it will be used, other wise it will create a new cache with the default
// settings
final CompositeCacheManager compositeCacheManager = new CompositeCacheManager(simpleCacheManager,
caffeineCacheManager);
return compositeCacheManager;
}
private CaffeineCache buildCache(final String name, final String cacheSpec) {
final CaffeineCache caffeineCache = new CaffeineCache(name, Caffeine.from(cacheSpec)
.build());
logger.debug("created custom cache: name='{}', and spec='{}'", name, cacheSpec);
return caffeineCache;
}
}
Спасибо https://medium.com/@d.lopez.j/configuring-multiple-ttl-caches-in-spring-boot-dinamically-75f4aa6809f3 за вдохновение