2014-11-14 68 views
0

定製RefreshAheadCacheFactory在嘗試使用在線刷新implment我自己的緩存加載器,並在閱讀文檔:編寫使用的Ehcache

http://terracotta.org/documentation/4.1/bigmemorymax/api/refresh-ahead#scheduled-refresh-ahead

&

http://www.ehcache.org/generated/2.9.0/html/ehc-all/#page/Ehcache_Documentation_Set%2Fco-dec_creating_a_decorator_2.html

但我不確定如何暗示我自己的緩存。應該如何方法createCacheLoader在這個類implmeneted:

public class MyCacheLoaderFactory extends net.sf.ehcache.loader.CacheLoaderFactory{ 

    @Override 
    public CacheLoader createCacheLoader(Ehcache cache, Properties properties) { 
     // TODO Auto-generated method stub 

     return null; 
    } 

} 

如何將返回創建緩存加載器的參數緩存是如何配置什麼&屬性?

我已經連接好使用下面的代碼在一個JUnit緩存:

import java.util.Properties; 

import net.sf.ehcache.Ehcache; 
import net.sf.ehcache.loader.CacheLoader; 


public class MyCacheLoaderFactory extends net.sf.ehcache.loader.CacheLoaderFactory{ 

    @Override 
    public CacheLoader createCacheLoader(Ehcache cache, Properties properties) { 
     // TODO Auto-generated method stub 

     return null; 
    } 

} 


<?xml version="1.0" encoding="UTF-8"?> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> 
    <defaultCache eternal="true" maxElementsInMemory="100" 
     overflowToDisk="false" /> 
    <cache name="myCache" maxElementsInMemory="10000" eternal="true" 
     overflowToDisk="false"> 

    <cacheLoaderFactory class="MyCacheLoaderFactory" 
    /> 

     <cacheDecoratorFactory 
      class="net.sf.ehcache.constructs.refreshahead.RefreshAheadCacheFactory" 
      properties="name=myCacheRefresher, 
     timeToRefreshSeconds=20, 
     batchSize=10, 
     numberOfThreads=4, 
     maximumBacklogItems=100, 
     evictOnLoadMiss=true" /> 

    </cache> 
</ehcache> 

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 
    <cache:annotation-driven /> 
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
     p:cache-manager-ref="ehcache" /> 
    <bean id="ehcache" 
     class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
     p:config-location="my-ehcache.xml" /> 

    <bean id="myCache" class="ehcache.MyCache"></bean> 
</beans> 

測試類:

package ehcache; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:spring-ehcache.xml") 
public class TestEhcache { 

    @Test 
    public void testCache(){ 

     while(true){ 
      System.out.println(myCache.tester()); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


    @Autowired 
    private MyCache myCache; 

} 


package ehcache; 

import org.springframework.cache.annotation.Cacheable; 

public class MyCache { 


    @Cacheable(value = "myCache") 
    public String tester(){ 

     System.out.println("in cache"); 

     return "test"; 
    } 

} 

當我運行測試testCache我收到異常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManager' defined in class path resource [spring-ehcache.xml]: Cannot resolve reference to bean 'ehcache' while setting bean property 'cacheManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ehcache' defined in class path resource [spring-ehcache.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: java.lang.NullPointerException 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) 

我期望這是由於我的createCacheLoader實現只是返回null,但應該如何返回對象t構建CacheLoader?

這可能是不相關的,但這裏是我的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>ehcache-test</groupId> 
    <artifactId>ehcache-test</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>net.sf.ehcache.internal</groupId> 
      <artifactId>ehcache-core</artifactId> 
      <version>2.9.0</version> 
     </dependency> 

     <dependency> 
      <groupId>cglib</groupId> 
      <artifactId>cglib</artifactId> 
      <version>2.2</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>3.1.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>3.1.0.RELEASE</version> 
     </dependency> 
    </dependencies> 
</project> 

回答

1

它是由你在你的MyCacheLoaderFactory類返回從方法的CacheLoader的實現。

第一個參數是要返回加載程序的緩存 - 如Javadoc中記錄的CacheLoaderFactory.createCacheLoader它尚未初始化,因此不應使用,但可以查詢其配置。 當您使用單個工廠向不同的緩存提供CacheLoader時,此參數非常有用。

第二個參數是在XML配置中定義的屬性,與您對cacheDecoratorFactory所做的相同。