简体   繁体   English

如何在没有xml的情况下使用spring boot 2和ehcache 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:它指的是以下 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.它工作正常,但我想摆脱 xml 配置。

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我已经阅读并尝试应用以下答案(最后一段代码)但它仅适用于 Ehcache 2 但我将使用 Eehcache 3

How can I achieve it ?我怎样才能实现它?

As EhCache seems to be JSR-107 compliant , you'll need to use it this way to have a programatic configuration:由于 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;
}

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.查看此编程示例,其中包含来自 EhCache 存储库的更多配置选项以及有关如何以编程方式注册侦听器的文档部分。

Here is my solution这是我的解决方案

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

equivalent of :相当于:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM