Почему мой аннотированный метод @Cachable не кэширует результат с помощью EHCache? - PullRequest
2 голосов
/ 14 сентября 2011

Весной у меня есть перехватчик, который автоматически связывает два разных сервиса. Оба сервиса имеют методы, которые помечены @Cacheable из проекта ehcache-spring-annotations, но отличаются cacheNames.

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-spring-annotations, и он регистрирует оба метода при запуске:

[DEBUG] 08:09:01 () Добавление рекомендованного CACHE метода 'getFolderEventsForUser' с атрибутом: CacheableAttributeImpl [cache = [имя = ecomOrders status = STATUS_ALIVE eternal = false overflowToDisk = false maxElementsInMemory = 0 = 300 timeToIdleSeconds = 0 diskPersistent = ложные diskExpiryThreadIntervalSeconds = 120 cacheEventListeners: net.sf.ehcache.statistics.LiveCacheStatisticsWrapper HitCount = 0 memoryStoreHitCount = 0 diskStoreHitCount = 0 missCountNotFound = 0 missCountExpired = 0], cacheKeyGenerator = HashCodeCacheKeyGenerator [includeMethod = верно, includeParameterTypes = истина , useReflection = false, checkforCycles = false], entryFactory = null, exceptionCache = null, parameterMask = ParameterMask [mask = []]] [] в com.googlecode.ehcache.annotations.impl.CacheAttributeSourceImpl.getMethodAttribute (CacheImplj.jj )

[DEBUG] 08:09:01 () Добавление рекомендованного CACHE метода 'getOrgCustomProfile' с атрибутом: CacheableAttributeImpl [cache = [name = orgProfile status = STATUS_ALIVE eternal = false overflowToDisk = false maxElementsInMemory = 200 maxElectionsToLextSoloStoreStoreStoreDoSourceStoreStore = 86400 timeToIdleSeconds = 0 diskPersistent = ложные diskExpiryThreadIntervalSeconds = 120 cacheEventListeners: net.sf.ehcache.statistics.LiveCacheStatisticsWrapper HitCount = 0 memoryStoreHitCount = 0 diskStoreHitCount = 0 missCountNotFound = 0 missCountExpired = 0], cacheKeyGenerator = HashCodeCacheKeyGenerator [includeMethod = верно, includeParameterTypes = истина , useReflection = false, checkforCycles = false], entryFactory = null, exceptionCache = null, parameterMask = ParameterMask [mask = []]] [] в com.googlecode.ehcache.annotations.impl.CacheAttributeSourceImpl.getMethodAttribute (CacheImplj.jj )

Когда перехватчик вызывает автоматические услуги, только один из них кэширует:

[DEBUG] 08:09:19 (UNIQUE_ID) Сгенерированный ключ '-1668638847278617' для вызова: ReflectiveMethodInvocation: общедоступный реферат getOrgCustomProfile (java.lang.String) выбрасывает no.finntech.service.ServiceException; цель относится к классу [no.finntech.service.organisation.impl.OrganisationInfoServiceImpl] [URI: / finn / minfinn / myitems / list, удаленный IP: 127.0.0.1, реферир:, пользователь-агент: Mozilla / 5.0 (Windows NT 6.1 ; WOW64; rv: 6.0.2) Gecko / 20100101 Firefox / 6.0.2] на com.googlecode.ehcache.annotations.interceptor.EhCacheInterceptor.generateCacheKey (EhCacheInterceptor.java:272)

EDIT: Вероятно, я должен упомянуть, что эти два сервиса определены в разных модулях maven.

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Оказывается, причина была связана с контекстом: компонент-сканирование.Служба, которая не смогла кэшировать, была включена в два разных компонента сканирования.Как только я решил, что кэширование работает, как ожидалось.

3 голосов
/ 14 сентября 2011

Как вы вызываете второй метод, через интерфейс OrganisationInfoService? Аннотации основаны на вызове метода через интерфейс, чтобы можно было создать прокси, который выполняет кеширование.

Если вы вызываете конкретный класс напрямую либо извне, либо как вызов из другого метода в классе, аннотации работать не будут.

См. Ответы 3 и 4 в FAQ: http://code.google.com/p/ehcache-spring-annotations/wiki/FrequentlyAskedQuestions

...