Проблемы с кешированием Spring при использовании AspectJ LTW

Я использую механизм абстракции кеша из Spring 3.0 RC1: я настроил байт-код (на основе AspectJ), чтобы механизм кеширования можно было применять к методам, вызываемым из самого класса. Стоит сказать, что сначала я использовал подход на основе прокси: все работало нормально (потому что методы вызываются из другого объекта).

Как только переключаюсь на AspectJ (активировал LTW через, добавил на их место нужные баночки - все работает нормально, никаких исключений не выкидывается) кеширования не происходит

Любое предложение? Спасибо.

==== редактировать позже ========

Я установил журналы для DEBUG для org.springframework.

При использовании режима прокси я ясно вижу сообщение Добавление кешируемого метода 'getLargeAssetContent' .... где getLargeAssetContent - мой "кешируемый" метод ... (см. Ниже)

При использовании режима aspectj я не вижу этого сообщения ... все запросы отправляются на уровень DAO ... где, как и в ситуации, когда кеш работает, запросы останавливаются на уровне обслуживания.

Что я делаю не так? Мне нужен aop.xml? Я не использовал АОП ...., поэтому у меня еще нет aop.xml.

Спасибо за помощь.

*> * 2011-12-12 16: 38: 55,998 ОТЛАДКА [org.springframework.cache.annotation.AnnotationCacheOperationSource]

(http-127.0.0.1-8080-6) Добавление кэшируемого метода getLargeAssetContent с атрибутом: [CacheOperation [public com.mycompany.myprj.model.AssetContent com.mycompany.myprj.dao.jcr.AssetDAOImpl.getLargeAssetContent (java.lang .String) выбрасывает com.mycompany.myprj.dao.MyPrjPersistenceException] caches = [assets] | условие = '' | key = '# nodeId'] 2011-12-12 16:38: 56,013 INFO [com.mycompany.myprj.dao.jcr.AssetDAOImpl] (http-127.0.0.1-8080-6) Получение содержимого (getLargeAssetContent) актива с узла с id = 575d8dc0-01be-41e4-85ce-a654fab97fe8 2011-12-12 16: 38: 56,092 INFO [com.mycompany.myprj.dao.jcr.AssetDAOImpl] (http-127.0.0.1-8080-6) Возвращение содержимое актива из узла с id = 575d8dc0-01be-41e4-85ce-a654fab97fe8 **

*

// содержимое кэшировано к настоящему моменту 2011-12-12 16: 38: 57,654 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] (http-127.0.0.1-8080-6) Возвращение кэшированного экземпляра singleton bean ' assetController '2011-12-12 16: 38: 57,654 DEBUG [org.springframework.web.servlet.DispatcherServlet] (http-127.0.0.1-8080-6) Значение Last-Modified для [/ myprj / asset / get / 575d8dc0- 01be-41e4-85ce-a654fab97fe8]: -1 2011-12-12 16: 38: 57,654 INFO [com.mycompany.myprj.services.AssetService] (http-127.0.0.1-8080-6) Получение актива с идентификатором: 57 год

*


person silverb77    schedule 08.12.2011    source источник
comment
Когда вы сказали, что LTW включен, вы добавили <context:load-time-weaver/> в свой контекст, верно?   -  person Kilokahn    schedule 08.01.2013
comment
Я столкнулся с е = той же проблемой. Вы смогли найти решение?   -  person Harshil Sharma    schedule 02.01.2017
comment
Я тоже, все еще не в состоянии сделать это с LTW. А пока вернитесь в режим прокси.   -  person Stephane Toussaint    schedule 07.03.2017


Ответы (2)


Убедитесь, что режим AspectJ включен (см. 28.3.3 Включить кеширование аннотаций):

<cache:annotation-driven mode="aspectj"/>

По умолчанию абстракция кэширования использует режим proxy, несмотря на то, что LTW включен (должен автоматически переключаться на aspectj IMHO, но это не так).

Если это не помогает проверить трассировку стека при вызове кешированного метода извне и изнутри - в чем различия?

person Tomasz Nurkiewicz    schedule 08.12.2011
comment
Спасибо, но я это сделал (‹cache: режим, управляемый аннотациями = aspectj /›). Постараюсь поискать следы. - person silverb77; 08.12.2011
comment
Просто из любопытства, кому-то удалось заставить эту штуку работать? (т.е. используя абстракцию кеширования с аспектомj) - person silverb77; 08.12.2011

Я попробовал это с образцом проекта, и мне нужно было сделать следующее, чтобы переключиться с обычного прокси на аспектj LTW.

  • Изменить <cache:annotation-driven mode="aspectj"/>
  • Добавьте в путь к классам аспектj-weaver и весенние аспекты (легко идентифицировать при появлении исключения ClassNotFoundException)
  • Имейте aop.xml по умолчанию в META-INF / aop.xml (это с настройками по умолчанию и конфигурацией прокси-классов в моем конкретном пакете - в противном случае он будет прокси-классы во всей JVM - вам нужно позвонить на )
  • Добавить <context:load-time-weaver aspectj-weaving="on"/> (по умолчанию автоматическое определение, которое автоматически завершится ошибкой, если META-INF / aop.xml не найден)
  • Добавьте переключатель javaagent в виртуальную машину и направьте его на сосуд с пружинным инструментом, если вы используете его автономно. Если вы находитесь в контейнере, вы можете либо использовать javaagent, либо настроить его для определенного загрузчика классов, как указано в ссылка.
person Kilokahn    schedule 10.01.2013