Как использовать Spring boot 2 и ehcache 3 без xml?

На данный момент у меня есть следующая конфигурация:

@Configuration
@EnableCaching
public class EhcacheConfig {
    @Bean
    public CacheManager cacheManager() throws URISyntaxException {
        return new JCacheCacheManager(Caching.getCachingProvider().getCacheManager(
                getClass().getResource("/ehcache.xml").toURI(),
                getClass().getClassLoader()
        ));
    }
}

Это относится к следующему XML:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xsi:schemaLocation="
            http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
            http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

    <cache alias="pow_cache">
        <key-type>org.springframework.cache.interceptor.SimpleKey</key-type>
        <value-type>java.lang.Double</value-type>
        <expiry>
            <ttl unit="seconds">15</ttl>
        </expiry>

        <listeners>
            <listener>
                <class>my.pack.CacheEventLogger</class>
                <event-firing-mode>ASYNCHRONOUS</event-firing-mode>
                <event-ordering-mode>UNORDERED</event-ordering-mode>
                <events-to-fire-on>CREATED</events-to-fire-on>
                <events-to-fire-on>EXPIRED</events-to-fire-on>
            </listener>
        </listeners>

        <resources>
            <heap unit="entries">2</heap>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>

</config>

А сервис выглядит так:

@Cacheable(value = "pow_cache", unless = "#pow==3||#result>100", condition = "#val<5")
public Double pow(int val, int pow) throws InterruptedException {
    System.out.println(String.format("REAL invocation myService.pow(%s, %s)", val, pow));
    Thread.sleep(3000);
    return Math.pow(val, pow);
}

Он работает правильно, но я хочу избавиться от конфигурации xml.

Я прочитал и попытался применить следующий ответ (последний фрагмент кода), но он работает только для Ehcache 2, но я собираюсь использовать Eehcache 3

Как я могу этого добиться?


person gstackoverflow    schedule 12.09.2019    source источник
comment
@Sambit это не дубликат. Я упомянул эту тему в своем вопросе. Пожалуйста будьте внимательны   -  person gstackoverflow    schedule 12.09.2019
comment
Спасибо, что сообщили мне.   -  person Sambit    schedule 12.09.2019


Ответы (2)


Поскольку EhCache кажется совместимым с JSR-107, вам нужно будет использовать его таким образом, чтобы получить программную конфигурацию:

@Bean
public CacheManager cacheManager() throws URISyntaxException {
    CachingProvider provider = Caching.getCachingProvider();  
    CacheManager cacheManager = provider.getCacheManager();   

    CacheConfigurationBuilder<SimpleKey, Double> configuration = 
    CacheConfigurationBuilder.newCacheConfigurationBuilder(org.springframework.cache.interceptor.SimpleKey.class,
        java.lang.Double.class, 
        ResourcePoolsBuilder.heap(2).offheap(10, MemoryUnit.MB))
        .withExpiry(Expirations.timeToLiveExpiration(new Duration(15, TimeUnit.SECONDS)));

    Cache cache = cacheManager.createCache("pow_cache", configuration);
    cache.getRuntimeConfiguration().registerCacheEventListener(listener, EventOrdering.UNORDERED,
        EventFiring.ASYNCHRONOUS, EnumSet.of(EventType.CREATED, EventType.EXPIRED)); 
    return cacheManager;
}

Сам не тестировал, но это должно сработать для вас.

Ознакомьтесь с этим программный образец с дополнительными параметрами конфигурации из репозитория EhCache и документацией на как регистрировать слушателей программно тоже.

person Xtreme Biker    schedule 16.09.2019
comment
где ресурсы (куча / offheap / диск) часть? - person gstackoverflow; 20.09.2019
comment
Обновлено для вашего конкретного случая ;-) - person Xtreme Biker; 20.09.2019
comment
Из каких пакетов эти классы? Я пытаюсь повторно использовать это решение, но, к сожалению, безуспешно. Более того, когда я пытаюсь использовать этот код вместо CachingConfigurer.cacheManager(), я получаю сообщение об ошибке Error creating bean with name 'cacheResolver' ... java.lang.IllegalArgumentException: CacheManager is required - person Iwo Kucharski; 27.05.2020
comment
Как программно изменить memoryStoreEvictionPolicy на LFU? - person Dmitriy; 04.07.2020

Вот мое решение

@Bean
CacheManager getCacheManager() {

    CachingProvider provider = Caching.getCachingProvider();
    CacheManager cacheManager = provider.getCacheManager();

    CacheConfigurationBuilder<String, String> configurationBuilder =
            CacheConfigurationBuilder.newCacheConfigurationBuilder(
                    String.class, String.class,
                    ResourcePoolsBuilder.heap(1000)
                                        .offheap(25, MemoryUnit.MB))
                                     .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofHours(3)));

    CacheEventListenerConfigurationBuilder asynchronousListener = CacheEventListenerConfigurationBuilder
            .newEventListenerConfiguration(new CacheEventLogger()
                    , EventType.CREATED, EventType.EXPIRED).unordered().asynchronous();

    //create caches we need
    cacheManager.createCache("productCatalogConfig",
                             Eh107Configuration.fromEhcacheCacheConfiguration(configurationBuilder.withService(asynchronousListener)));

    return cacheManager;
}

эквивалент:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.ehcache.org/v3"
    xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
    xsi:schemaLocation="
        http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
        http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

<cache alias="productCatalogConfig">
    <key-type>java.lang.String</key-type>
    <value-type>java.lang.String</value-type>
    <expiry>
        <ttl unit="seconds">1600</ttl>
    </expiry>

    <listeners>
        <listener>
            <class>com.klarna.paynow.card.config.CacheEventLogger</class>
            <event-firing-mode>ASYNCHRONOUS</event-firing-mode>
            <event-ordering-mode>UNORDERED</event-ordering-mode>
            <events-to-fire-on>CREATED</events-to-fire-on>
            <events-to-fire-on>EXPIRED</events-to-fire-on>
        </listener>
    </listeners>

    <resources>
        <heap unit="entries">1000</heap>
        <offheap unit="MB">25</offheap>
    </resources>
</cache>
person Nodirbek    schedule 29.09.2020