2011-09-14 58 views
2

我在Spring中有一個攔截器,它自動裝載兩種不同的服務。 這兩個服務都有方法,這些方法使用ehcache-spring-annotations項目中的@Cacheable標記,但使用不同的cacheNames爲什麼我的@Cachable註釋方法不會使用EHCache緩存結果?

public class MenuInterceptor extends HandlerInterceptorAdapter { 
    @Autowired 
    private EventService eventService; 

    @Autowired 
    private OrganisationInfoService orgService; 

    @Override 
    public final void postHandle(HttpServletRequest request, 
         HttpServletResponse response, 
         Object handler, 
         ModelAndView modelAndView) throws SystemException { 
     eventService.getFolderEventsForUser(123); 
     orgService.getOrgCustomProfile("abc"); 

    } 

@Service 
public class EventServiceImpl implements EventService { 
    @Override 
    @Cacheable(cacheName = "ecomOrders") 
    public Collection<FolderEventBean> getFolderEventsForUser(long loginId) throws SystemException { 


@Service("organisationInfoService") 
public class OrganisationInfoServiceImpl implements OrganisationInfoService { 
    @Override 
    @Cacheable(cacheName="orgProfile") 
    public OrgCustomProfileBean getOrgCustomProfile(String orgHierarchyString) throws ServiceException { 

當我運行我的應用程序時,一種方法成功地使用EHCache作爲結果,而另一種方法不成功。 OrganisationInfoSericeImpl.getOrgCustomProfile()緩存正確,而EventServiceImpl.getFolderEvnetsForUser沒有。有人可以告訴我爲什麼嗎?

我試圖使用相同的緩存爲這兩種服務,但仍然只有其中一個工程。 我打開DEBUG爲ehcache的彈簧的註解,並且它在啓動期間寄存器兩種方法:

[DEBUG] 8點09分01秒()添加CACHE建議方法 'getFolderEventsForUser' 具有屬性:CacheableAttributeImpl [緩存= [name = ecomOrders status = STATUS_ALIVE eternal = false overflowToDisk = false maxElementsInMemory = 100 maxElementsOnDisk = 0 memoryStoreEvictionPolicy = LRU timeToLiveSeconds = 300 timeToIdleSeconds = 0 diskPersistent = false diskExpiryThreadIntervalSeconds = 120 cacheEventListeners:net.sf.ehcache.statistics.LiveCacheStatisticsWrapper hitCount = 0 memoryStoreHitCount = 0 diskStoreHitCount = 0 missCountNotFound = 0 missCountExpired = 0],cacheKeyGenerator = HashCodeCacheKeyGenerator [includeMethod = true,includeParameterTypes = true,useReflection = false,checkforCycle S = FALSE],entryFactory = NULL,exceptionCache = NULL,parameterMask = ParameterMask [掩模= []]] []在com.googlecode.ehcache.annotations.impl.CacheAttributeSourceImpl.getMethodAttribute(CacheAttributeSourceImpl.java:174)

[DEBUG] 08:09:01()添加具有以下屬性的CACHE建議方法'getOrgCustomProfile':CacheableAttributeImpl [cache = [name = orgProfile status = STATUS_ALIVE eternal = false overflowToDisk = false maxElementsInMemory = 200 maxElementsOnDisk = 0 memoryStoreEvictionPolicy = LRU timeToLiveSeconds = 86400 timeToIdleSeconds = 0 diskPersistent = false diskExpiryThreadIntervalSeconds = 120 cacheEventListeners:net.sf.ehcache.statistics.LiveCacheStatisticsWrapper hitCount = 0 memoryStoreHitCount = 0 diskStoreHitCount = 0 missCountNotFound = 0 missCountExpired = 0],cacheKeyGenerator = HashCodeCacheKeyGenerator [includeMethod = true,includeParameterTypes = true,useRef (com.googlecode.ehcache.annotations.impl.CacheAttributeSourceImpl.getMethodAttribute(CacheAttributeSourceImpl.java:174))中的參數列表= false,checkforCycles = false,entryFactory = null,exceptionCache = null,parameterMask = ParameterMask [mask = []]]

當攔截器調用自動連接服務,但其中只有一個緩存:

[DEBUG] 8時09分19秒(UNIQUE_ID)產生的密鑰 '-1668638847278617' 的調用:ReflectiveMethodInvocation:公共抽象no.finntech.base.modules.organisation.support.OrgCustomProfileBean no.finntech.service.organisation.OrganisationInfoService.getOrgCustomProfile(java.lang.String)throws no.finntech.service.ServiceEx ception;目標是[no.finntech.service.organisation.impl.OrganisationInfoServiceImpl] [URI:/ finn/minfinn/myitems/list,遠程IP:127.0.0.1,引用者:,User-Agent:Mozilla/5.0(Windows NT 6.1 ; WOW64; RV:6.0.2)壁虎/ 20100101火狐/ 6.0.2]在com.googlecode.ehcache.annotations.interceptor.EhCacheInterceptor.generateCacheKey(EhCacheInterceptor.java:272)

編輯: 我應該可能會提到這兩個服務是在不同的Maven模塊中定義的。

回答

3

原來的原因是與上下文相關:組件掃描。 未能緩存的服務包含在兩個不同的組件掃描中。只要我決定高速緩存按預期工作。

3

你是怎麼調用第二種方法的,它是否通過OrganisationInfoService接口?註釋依賴於通過接口調用方法,因此可以生成執行緩存的代理。

如果您直接從外部調用具體類,或者從類中的另一種方法調用,則註釋將不起作用。

條回答3和4的常見問題解答: http://code.google.com/p/ehcache-spring-annotations/wiki/FrequentlyAskedQuestions

+0

兩者都通過各自的接口調用。 – Nicolai

+0

嗯,第一個緩存的timetoLive值爲300secs,而另一個(即86400s) - 這意味着無論上次訪問時間5分鐘緩存的對象都會被逐出,所以如果該方法只針對給定的loginId很少調用它看起來好像沒有被緩存。這可能是原因嗎? – Paolo

+0

目前我只是測試一下,並檢查它是否被緩存。電話是在幾秒鐘內完成的。緩存代理永遠不會用於EventService,因此我猜想必須有某種設置/配置問題。 – Nicolai

相關問題