首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

【100分】【】Spring+ibatis+ehcache MethodCacheInterceptor的invoke方法没有执行

2013-10-31 
【100分】【在线等】Spring+ibatis+ehcache MethodCacheInterceptor的invoke方法没有执行小弟最新做一个项目

【100分】【在线等】Spring+ibatis+ehcache MethodCacheInterceptor的invoke方法没有执行
小弟最新做一个项目 需要使用到Spring+ibatis+ehcache 参照网上的资料自己写了一些配置 可惜MethodCacheInterceptor的invoke方法始终没有执行。想请各位高人指点迷津

这个是Tomcat启动log信息 其中MethodCacheInterceptor已经被初始化了


2013-10-29 10:17:24,179 INFO [org.springframework.cache.ehcache.EhCacheManagerFactoryBean]  main org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:100) - <Initializing EHCache CacheManager>
2013-10-29 10:17:26,693 INFO [net.sf.ehcache.util.UpdateChecker]  net.sf.ehcache.CacheManager@7b7d8769 net.sf.ehcache.util.UpdateChecker.doCheck(UpdateChecker.java:98) - <New update(s) found: 2.6.5 [http://www.terracotta.org/confluence/display/release/Release+Notes+Ehcache+Core+2.6]. Please check http://ehcache.org for the latest version.>
2013-10-29 10:17:30,781 INFO [com.gaotime.datadictionary.utils.MethodCacheInterceptor]  main com.gaotime.datadictionary.utils.MethodCacheInterceptor.afterPropertiesSet(MethodCacheInterceptor.java:30) - <[ name = lowFreCache status = STATUS_ALIVE eternal = false overflowToDisk = true maxEntriesLocalHeap = 100000 maxEntriesLocalDisk = 500000 memoryStoreEvictionPolicy = LFU timeToLiveSeconds = 28800 timeToIdleSeconds = 28800 diskPersistent = false diskExpiryThreadIntervalSeconds = 120 cacheEventListeners: net.sf.ehcache.statistics.LiveCacheStatisticsWrapper  hitCount = 0 memoryStoreHitCount = 0 diskStoreHitCount = 0 missCountNotFound = 0 missCountExpired = 0 maxBytesLocalHeap = 0 overflowToOffHeap = false maxBytesLocalOffHeap = 0 maxBytesLocalDisk = 0 pinned = false ] A cache is required. Use setCache(Cache) to provide one.>


这个是ehcache文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" 
updateCheck="true"
monitoring="autodetect">
<diskStore path="java.io.tmpdir/ehcache" /> 
<defaultCache maxElementsInMemory="10000" 
eternal="false" 
timeToIdleSeconds="600" 
timeToLiveSeconds="600" 
overflowToDisk="true" 
diskSpoolBufferSizeMB="30"
maxElementsOnDisk="50000" 
diskPersistent="false" 
diskExpiryThreadIntervalSeconds="120" 
memoryStoreEvictionPolicy="LRU"/>

 <!-- 8小时更新缓存 -->
<cache name="lowFreCache" 
maxElementsInMemory="100000"
maxElementsOnDisk="500000" 
eternal="false" 
overflowToDisk="true"
diskPersistent="false" 
diskSpoolBufferSizeMB="30" 
timeToIdleSeconds="28800" 
timeToLiveSeconds="28800"
memoryStoreEvictionPolicy="LFU" />
</ehcache>  


这个是applicationContext-cache.xml配置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:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"  
xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/cache 
http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
    http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring     
    http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    
    <!-- cacheManager工厂类,指定ehcache.xml的位置   -->
    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
        p:configLocation="classpath:/cache/ehcache.xml" p:shared="true"/>
        
     <!--声明cacheManager -->
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
        p:cacheManager-ref="cacheManagerFactory" />     
        
     <!-- 8小时更新缓存 -->
    <bean id="lowFreCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
        <property name="cacheManager" ref="cacheManagerFactory" />


        <property name="cacheName" value="lowFreCache" />
    </bean>
    <bean id="lowFreMethodCacheInterceptor" class="com.gaotime.datadictionary.utils.MethodCacheInterceptor">
        <property name="cache" ref="lowFreCache"/>
    </bean>
    <bean id="lowFreMethodCachePointCut"    class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice" ref="lowFreMethodCacheInterceptor" />
        <property name="patterns">
            <list>                 <value>com.gaotime.datadictionary.kernel.service.impl.DataDictionaryServiceImpl\.getTableStructureInfoMap</value>
            </list>
        </property>
    </bean>
</beans>



这个是MethodCacheInterceptor类代码


import java.io.Serializable;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.InitializingBean;
 
/**
 * <b>function:</b> 缓存方法拦截器代码 
 * @file MethodCacheInterceptor.java
 * @project Ehcache
 * @version 1.0
 */
public class MethodCacheInterceptor implements MethodInterceptor, InitializingBean {
 
    private static final Logger log = Logger.getLogger(MethodCacheInterceptor.class);
    
    private Cache cache;
 
    public void setCache(Cache cache) {
        this.cache = cache;
    }
 
    public void afterPropertiesSet() throws Exception {
        log.info(cache + " A cache is required. Use setCache(Cache) to provide one.");
    }
 
    public Object invoke(MethodInvocation invocation) throws Throwable {
        String targetName = invocation.getThis().getClass().getName();
        String methodName = invocation.getMethod().getName();
        Object[] arguments = invocation.getArguments();
        Object result;
 
        String cacheKey = getCacheKey(targetName, methodName, arguments);
        Element element = null;
        try{
        synchronized (this) {
            element = cache.get(cacheKey);
            if (element == null) {
//                log.info(cacheKey + "  Added to the cache: " + cache.getName());
                result = invocation.proceed();
                element = new Element(cacheKey, (Serializable) result);
                cache.put(element);
            } else {
//                log.info(cacheKey + "   Use Cached: " + cache.getName());
            }
        }
        }catch(Exception e){
        e.printStackTrace();
        log.error(e.getMessage());
        }
        return element.getValue();
    }
 
    /**
     * <b>function:</b> 返回具体的方法全路径名称 参数
     * @param targetName 全路径
     * @param methodName 方法名称
     * @param arguments 参数


     * @return 完整方法名称
     */
    private String getCacheKey(String targetName, String methodName, Object[] arguments) {
        StringBuffer sb = new StringBuffer();
        sb.append(targetName).append(".").append(methodName);
        if ((arguments != null) && (arguments.length != 0)) {
            for (int i = 0; i < arguments.length; i++) {
                sb.append(".").append(arguments[i]);
            }
        }
        return sb.toString();
    }
}



这个是classpath信息

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="conf"/>
<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/ehcache-core-2.5.0.jar"/>
<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/ehcache-web-2.0.4.jar"/>
<classpathentry kind="output" path="WebRoot/WEB-INF/classes"/>
</classpath>



这个是applicationContext.xml配置

<?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:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <context:annotation-config/>    
<!-- ① :对 web 包中的所有类进行扫描,以完成 Bean 创建和自动依赖注入的功能 -->
    <context:component-scan base-package="com.gaotime.datadictionary.web.controller" />
    <!-- ② :启动 Spring MVC 的注解功能,完成请求和注解 POJO 的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" />
            </list>
        </property>
    </bean>
    <!-- ③ :对模型视图名称的解析,即在模型视图名称添加前后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
    <!-- Controller层异常处理 -->
    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView">
            <value>error/error</value>
        </property>
    </bean>
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
    <import resource="spring/applicationContext-cache.xml"/>
</beans>
ibatis spring 缓存 invoke没有执行 ehcache


[解决办法]
你先用普通 Java 调用 ClassPathXmlApplicationContext 整合看看能成功不
[解决办法]
建议检查下切面的代码是否正确
<bean id="lowFreMethodCachePointCut"    class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <property name="advice" ref="lowFreMethodCacheInterceptor" />
        <property name="patterns">
            <list>                 <value>com.gaotime.datadictionary.kernel.service.impl.DataDictionaryServiceImpl\.getTableStructureInfoMap</value>
            </list>
        </property>
    </bean>
[解决办法]

引用:
您指的代码是否存在? 还是表达式语法有问题?
如果是代码是否存在的话这个应该没问题 Impl文件直接可以点开看到
如果是表达式有问题 请教如何写是正确的呢?
小弟是spring初学者 请多多指教

我指的是表达式,你可以找下SpringAOP的切面表达式语法,你的语法有误。
http://www.iteye.com/topic/1120750

热点排行