flexible caffeine cache manager
parent
d2f3e3c683
commit
30d08e49d0
|
@ -26,3 +26,4 @@ hs_err_pid*
|
|||
*~
|
||||
\#*\#
|
||||
\.\#
|
||||
/.project
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
eclipse.preferences.version=1
|
||||
encoding/<project>=UTF-8
|
|
@ -1,4 +1,9 @@
|
|||
# Java Lessons
|
||||
|
||||
1) [Lesson #1](springboot2-junit5-skiptest/README.md) - How to write an annotation for your JUnit5 tests and to use application.properties from Spring environment
|
||||
2) [Lesson #2](springboot2-request-logger/README.md) - How to log every request in Spring/SpringBoot web application
|
||||
|
||||
2) [Lesson #2](springboot2-request-logger/README.md) - How to log every request in Spring/SpringBoot web application
|
||||
|
||||
# Snippets
|
||||
|
||||
1) [Flexible Caffeine Cache Manager](flexible-caffeine-cache/FlexibleCaffeineCacheManager.java) - How to separate different cache configurations into one application using Caffeine cache
|
|
@ -0,0 +1,98 @@
|
|||
package com.pf.core.cache;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Cache;
|
||||
import com.github.benmanes.caffeine.cache.CacheLoader;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.CaffeineSpec;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.cache.caffeine.CaffeineCacheManager;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/** Flexible Caffeine cache manager
|
||||
* Idea: {@see "https://dzone.com/articles/multiple-cache-configurations-with-caffeine-and-sp"}
|
||||
*
|
||||
* to be used in cases when you need different settings per cache name
|
||||
*
|
||||
*/
|
||||
@Slf4j
|
||||
@ConfigurationProperties(prefix = "cache")
|
||||
public class FlexibleCaffeineCacheManager extends CaffeineCacheManager implements InitializingBean {
|
||||
|
||||
/**
|
||||
* default <code>spring.cache.cache-names</code> settings
|
||||
* will be overridden with {@link FlexibleCaffeineCacheManager#specs}
|
||||
*/
|
||||
@Value("${spring.cache.cache-names:}")
|
||||
private String springCacheNames;
|
||||
|
||||
/**
|
||||
* default <code>spring.cache.caffeine.spec</code> settings
|
||||
* will be overridden with {@link FlexibleCaffeineCacheManager#specs}
|
||||
*/
|
||||
@Value("${spring.cache.caffeine.spec:}")
|
||||
private String springCacheSpecs;
|
||||
|
||||
/**
|
||||
* This field could be populated from <code>application.(yaml|properties)</code> file
|
||||
* All features are listed into {@link CaffeineSpec}
|
||||
*/
|
||||
@Getter @Setter
|
||||
private Map<String, String> specs = new ConcurrentHashMap<>();
|
||||
@Getter
|
||||
private Map<String, Caffeine<Object, Object>> builders = new ConcurrentHashMap<>();
|
||||
|
||||
private CacheLoader<Object, Object> cacheLoader;
|
||||
@Override
|
||||
public void setCacheLoader(@Nonnull CacheLoader<Object, Object> cacheLoader) {
|
||||
this.cacheLoader = cacheLoader;
|
||||
}
|
||||
|
||||
/**
|
||||
* reads all standard settings from application.(properties|yml) and adjust proper cache builders
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
if (StringUtils.hasText(springCacheNames) && !springCacheNames.equals("${spring.cache.cache-names:}")) {
|
||||
String[] cacheNames = springCacheNames.split(",");
|
||||
if (cacheNames.length > 0) {
|
||||
for (String cacheName : cacheNames) {
|
||||
if (StringUtils.hasText(cacheName)) {
|
||||
if (!specs.containsKey(cacheName.trim())) {
|
||||
specs.put(cacheName.trim(), springCacheSpecs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Map.Entry<String, String> cacheSpecEntry : specs.entrySet()) {
|
||||
log.info("Creating cache with name {} and specs: {}", cacheSpecEntry.getKey(), cacheSpecEntry.getValue());
|
||||
builders.put(cacheSpecEntry.getKey(), Caffeine.from(cacheSpecEntry.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
protected Cache<Object, Object> createNativeCaffeineCache(String name) {
|
||||
Caffeine<Object, Object> builder = builders.get(name);
|
||||
if (builder == null) {
|
||||
return super.createNativeCaffeineCache(name);
|
||||
}
|
||||
|
||||
if (this.cacheLoader != null) {
|
||||
return builder.build(this.cacheLoader);
|
||||
} else {
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue