Search code examples
javaspring-bootehcachespring-cacheehcache-3

How to use spring boot 2 and ehcache 3 without xml?


For now I have following config:

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

It refers to the following 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>

And service look like this:

@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);
}

It works properly but I want to get free of xml configuration.

I've read and tried to apply following answer(last piece of code) But it works only for Ehcache 2 but I am going to use Eehcache 3

How can I achieve it ?


Solution

  • As EhCache seems to be JSR-107 compliant, you'll need to use it this way to have a programatic configuration:

    @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;
    }
    

    Haven't tested it myself, but this should work for you.

    Check out this programatic sample with more configuration options from the EhCache repo and the docs part on how to register listeners programatically too.