Вызов перехватчика кеша игнорируется

Я работаю над реализацией кеша (exstremescale) для многомодульного проекта maven, где я добавил ниже зависимость maven

    <dependency>
        <groupId>com.ibm.extremescale</groupId>
        <artifactId>ogclient</artifactId>
        <version>8.6.0.20150901-215917</version>
    </dependency>

Добавлена ​​аннотация кеширования на

@Override
@Cacheable(value = "productDetails", key = "#productId + #orgId")
public Product productRead(final String productId, final String productKey, final String orgId, final CRApplicationEnum sourceSystem) throws IntegrationException {

кэш-менеджер.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

<cache:annotation-driven />
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager" primary="true">
    <property name="caches">    
        <set>
            <bean class="com.ibm.websphere.objectgrid.spring.ObjectGridCache"
                p:name="eventDetails"  p:map-name="${iev.eventDetails.mapName}"
                p:object-grid-client-ref="wxsGridClient" />

            <bean class="com.ibm.websphere.objectgrid.spring.ObjectGridCache"
                p:name="eventValidationDetails"  p:map-name="${iev.eventValidationDetails.mapName}"
                p:object-grid-client-ref="wxsGridClient" />

            <bean class="com.ibm.websphere.objectgrid.spring.ObjectGridCache"
                p:name="productDetails"  p:map-name="${ipr.productDetails.mapName}"
                p:object-grid-client-ref="wxsGridClient" />

        </set>
    </property>
</bean>
<bean id="wxsCSDomain"
    class="com.ibm.websphere.objectgrid.spring.ObjectGridCatalogServiceDomainBean"
    p:catalog-service-endpoints="${xscale.catalogServiceEndpoint}" />

<bean id="wxsGridClient"
    class="com.ibm.websphere.objectgrid.spring.ObjectGridClientBean"
    p:catalog-service-domain-ref="wxsCSDomain" p:objectGridName="${wxs.objectGridName}" />

Caching is working for only one maven module of the project, i can see the cache interceptor call and for rest of the maven module it is ignoring the @cacheable annotation(it is not going to the interceptor).

У нас нет PostConstructor или Самовызов

Мы используем atomikos в качестве менеджера транзакций и CXF-перехватчики, которые будут выполняться до перехода к методам кэширования.

Пожалуйста помоги мне с этим


person Sunil Rk    schedule 21.06.2016    source источник
comment
Я бы сказал, что работать над модулем, а не над другими, немного странно. Контекст приложения Spring не заботится о том, откуда были загружены ваши классы. Используете ли вы родительские/дочерние контексты?   -  person Stephane Nicoll    schedule 22.06.2016
comment
Во время отладки мы узнали, что список перехватчиков, подготовленный классом JdkDynamicAopProxy для бина с кэшируемой аннотацией, не добавляет перехватчик кеша в список.   -  person Sunil Rk    schedule 23.06.2016
comment
Не могли бы вы поделиться образцом, это было бы намного проще. Можете ли вы показать конфигурацию этого компонента? Вы случайно не выставляете интерфейс?   -  person Stephane Nicoll    schedule 25.06.2016


Ответы (2)


Ваш комментарий о JdkDynamixAopProxy и просмотр кода заставляют меня думать, что метод, который вы аннотировали @Cacheable, находится в конкретном классе. И чтобы аннотация к конкретному классу демонстрировала правильное поведение; вам нужно включить проксирование cglib в вашем приложении.

Это можно сделать, добавив параметр целевого класса прокси в тег, управляемый аннотациями кэша.

<cache:annotation-driven proxy-target-class="true"/>

Если вы не хотите включать проксирование на основе классов для всего приложения; вы можете указать поведение для определенного класса, аннотировав его этой аннотацией:

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)

person ritesh.garg    schedule 01.07.2016

Вызов методов в одном и том же классе обходит динамический прокси, и любые сквозные проблемы, такие как кэширование, транзакции и т. д., которые являются частью логики динамических прокси, также обходят. Итак, может ли ваша проблема быть Spring cache @ Кэшируемый метод игнорируется при вызове из того же класса ?

Если это так, исправление заключается в использовании времени компиляции AspectJ или времени загрузки.

person denov    schedule 01.07.2016