我在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模塊中定義的。
兩者都通過各自的接口調用。 – Nicolai
嗯,第一個緩存的timetoLive值爲300secs,而另一個(即86400s) - 這意味着無論上次訪問時間5分鐘緩存的對象都會被逐出,所以如果該方法只針對給定的loginId很少調用它看起來好像沒有被緩存。這可能是原因嗎? – Paolo
目前我只是測試一下,並檢查它是否被緩存。電話是在幾秒鐘內完成的。緩存代理永遠不會用於EventService,因此我猜想必須有某種設置/配置問題。 – Nicolai