在Spring Actuator中注册咖啡因缓存(CacheManager)

时间:2019-05-15 22:17:16

标签: spring-boot spring-boot-actuator spring-cache caffeine

我们正在使用Spring Boot 2和Spring Actuator。在创建如下所示的缓存时:

@Bean
public CaffeineCache someCache() {
    return new CaffeineCache("my-cache",
            Caffeine.newBuilder()
                    .maximumSize(1000)
                    .expireAfterWrite(10, TimeUnit.SECONDS)
                    .build());
}

它已注册到Spring Actuator中,并且可以通过端点进行访问和处理:

❯ http GET localhost:8080/actuator/caches

{
    "cacheManagers": {
        "cacheManager": {
            "caches": {
                "my-cache": {
                    "target": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalManualCache"
                }
            }
        }
    }
}

但是,这在使用注释@Cacheable时有效-但我想创建一个缓存并将其用作地图。

因此,我可以创建:

    @Bean
    public com.github.benmanes.caffeine.cache.Cache<String, MyObject> customCache(QueryServiceProperties config) {
        return Caffeine.newBuilder()
                .maximumSize(10)
                .expireAfterAccess(10, TimeUnit.SECONDS)
                .build();
    }

它可以工作,但 Spring Actuator 无法发现它。有什么方法可以注册这种缓存吗?

2 个答案:

答案 0 :(得分:1)

为此Answer改编而成,我执行了以下操作:

@Autowired
private CacheMetricsRegistrar cacheMetricsRegistrar;
private LoadingCache<Key, MyObject> cache;


@PostConstruct
public void init() {
    cache = Caffeine.newBuilder()
            .maximumSize(10_000)
            .refreshAfterWrite(cacheDuration)
            .recordStats()
            .build(this::loadMyObject);

    // trick the compiler
    Cache tmp = cache;
    cacheMetricsRegistrar.bindCacheToRegistry(new CaffeineCache(CACHE_NAME, tmp), Tag.of("name", CACHE_NAME));
}

缓存现在应显示在缓存执行器端点中,例如“ http://localhost:8080/metrics/cache.gets

答案 1 :(得分:0)

使用CacheManager

将您的自定义缓存添加到 CacheManager,注入 CacheManager 并取出该缓存供您使用。 请参阅 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html 了解更多详情