缓存刷新显示带有@cacheable注释的错误

时间:2015-03-11 09:42:00

标签: java spring caching ehcache

有人可以帮我调试此错误吗?

  

2015-03-11 14:59:03,844 [cachename.data]错误   n.s.e.store.disk.DiskStorageFactory - 磁盘写入-351643849550012   失败:java.io.NotSerializableException:   com.googlecode.ehcache.annotations.RefreshableCacheEntry at   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)   〜[na:1.6.0_45] at   java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)   〜[na:1.6.0_45] at   java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422)   〜[na:1.6.0_45] at   net.sf.ehcache.Element.writeObject(Element.java:867)   〜[ehcache-2.8.1.jar:2.8.1] at   sun.reflect.NativeMethodAccessorImpl.invoke0(原生方法)   〜[na:1.6.0_45] at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)   〜[na:1.6.0_45] at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)   〜[na:1.6.0_45] at java.lang.reflect.Method.invoke(Method.java:597)   〜[na:1.6.0_45] at   java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:940)   〜[na:1.6.0_45] at   java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)   〜[na:1.6.0_45] at   java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)   〜[na:1.6.0_45] at   java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)   〜[na:1.6.0_45] at   java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)   〜[na:1.6.0_45] at   net.sf.ehcache.util.MemoryEfficientByteArrayOutputStream.serialize(MemoryEfficientByteArrayOutputStream.java:97)   〜[ehcache-2.8.1.jar:2.8.1] at   net.sf.ehcache.store.disk.DiskStorageFactory.serializeElement(DiskStorageFactory.java:399)   〜[ehcache-2.8.1.jar:2.8.1] at   net.sf.ehcache.store.disk.DiskStorageFactory.write(DiskStorageFactory.java:381)   〜[ehcache-2.8.1.jar:2.8.1] at   net.sf.ehcache.store.disk.DiskStorageFactory $ DiskWriteTask.call(DiskStorageFactory.java:473)   〜[ehcache-2.8.1.jar:2.8.1] at   net.sf.ehcache.store.disk.DiskStorageFactory $ PersistentDiskWriteTask.call(DiskStorageFactory.java:1067)   [ehcache-2.8.1.jar:2.8.1] at   net.sf.ehcache.store.disk.DiskStorageFactory $ PersistentDiskWriteTask.call(DiskStorageFactory.java:1051)   [ehcache-2.8.1.jar:2.8.1] at   java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:303)   [na:1.6.0_45] at   java.util.concurrent.FutureTask.run(FutureTask.java:138)[na:1.6.0_45]     在   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:98)   [na:1.6.0_45] at   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)   [na:1.6.0_45] at   java.util.concurrent.ThreadPoolExecutor中的$ Worker.runTask(ThreadPoolExecutor.java:895)   [na:1.6.0_45] at   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:918)   [na:1.6.0_45]在java.lang.Thread.run(Thread.java:662)[na:1.6.0_45]

我正在使用带有@cacheable注释的缓存刷新:

CacheFetchDao.java

@Cacheable(cacheName = "cachename",refreshInterval=10000, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
//@Cacheable( value = "cachename", key = "#key")
public List<Account> getAccounts(String key) {
    //call to database
    return res;
}

CachefetchEndpoint.java

    @GET
@Path("/Accounts")
@WebMethod(operationName = "Accounts")
public List<Account> Accounts() {
    return dao.getAccounts("accounts");
}

ehcache.xml中

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" 
    updateCheck="true"
    monitoring="autodetect" 
    dynamicConfig="true">

    <diskStore path="java.io.tmpdir"/>  

    <defaultCache    
        maxElementsInMemory="100"  
        eternal="false"    
        timeToIdleSeconds="120"    
        timeToLiveSeconds="120"    
        overflowToDisk="true"    
        diskSpoolBufferSizeMB="30"    
        maxElementsOnDisk="10000000"    
        diskPersistent="false"    
        diskExpiryThreadIntervalSeconds="120"    
        memoryStoreEvictionPolicy="LRU"/>  

    <!-- The cache configuration for our Currency cache -->  
    <cache name="cachename"  
        maxElementsInMemory="3000"  
        eternal="false" 
        timeToIdleSeconds="120"  
        timeToLiveSeconds="120"  
        <persistence strategy="localTempSwap"/>
    </cache>  
</ehcache>  

和config.xml

 <ehcache:annotation-driven cache-manager="ehcache" />

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcache" />
        </bean>

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" >
            <property name="configLocation" value="ehcache.xml" />
</bean>  

2 个答案:

答案 0 :(得分:2)

我希望您的帐户类型实现Serializable接口 ?你也可以发帖吗?

答案 1 :(得分:0)

我通过删除diskPersistent =“false”解决了这个问题。 diskPersistent =“false”不能与decoratedCacheType = DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE

一起使用