现在,我有以下配置:
@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配置。
2,但我将使用Eehcache 3
我该如何实现?
由于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存储库中查看更多带有配置选项的程序示例,以及有关如何以编程方式注册侦听器的文档部分。