Зарегистрируйте кэш кофеина в приводе Spring (CacheManager) - PullRequest
0 голосов
/ 16 мая 2019

Мы используем 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 .Есть ли способ зарегистрировать этот тип кэша?

1 Ответ

1 голос
/ 12 июля 2019

Addapted от этого Ответ Я сделал следующее:

@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"

...