Проблемы весеннего кеширования при использовании AspectJ LTW - PullRequest
5 голосов
/ 08 декабря 2011

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

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

Есть предложения?Спасибо.

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

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

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

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

Что я делаю неправильно?Нужен ли мне aop.xml?Я не использовал AOP ...., поэтому у меня пока нет aop.xml.

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

*> * 2011-12-12 16:38: 55,998 DEBUG [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) Возвращение кэшированного экземпляра одиночного компонента 'assetController' 2011-12-12 16:38:57 654 DEBUG [org.springframework.web.servlet.DispatcherServlet] (http-127.0.0.1-8080-6) Последнее измененное значение для [/ 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

*

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

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

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

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

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

0 голосов
/ 10 января 2013

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

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