2011-09-14 7 views
2

私は2つの異なるサービスをautowireする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 { 

私は自分のアプリケーションを実行する

は、1つの方法は成功し、結果をEHCacheなどを使用しています。 EventServiceImpl.getFolderEvnetsForUserではなく、 OrganisationInfoSericeImpl.getOrgCustomProfile()のキャッシュが正しくキャッシュされます。誰かがなぜ私に教えてくれますか?

両方のサービスで同じキャッシュを使用しようとしましたが、どちらか一方のサービスしか使用できませんでした。 Iはehcacheを-ばね注釈のデバッグをオンにし、それは起動時にどちらの方法を登録:

[DEBUG]午前8時09分01秒()属性でCACHE助言方法 'getFolderEventsForUser' を追加:CacheableAttributeImpl [キャッシュ= [名前= ecomOrdersステータス= STATUS_ALIVE永遠の= falseのoverflowToDisk = falseのmaxElementsOnDisk = 0のmemoryEntryEnvironment = 0 diskStoreHitCount = 0 missCountNotFound = 0 missCountExpired = 0]、cacheKeyGenerator = HashCodeCacheKeyGenerator [includeMethod = true、includeParameterTypes = true、useReflection = false、checkforCycle S = FALSE]、entryFactory =ヌル、exceptionCache =ヌル、parameterMask = ParameterMask [マスク= []]] [] com.googlecode.ehcache.annotations.impl.CacheAttributeSourceImpl.getMethodAttribute(CacheAttributeSourceImpl.java:174)で

[DEBUG] 08:09:01()属性を持つgetArgCustomProfileメソッドを追加する:CacheableAttributeImpl [キャッシュ= [名前= orgProfileステータス= STATUS_ALIVE永遠= 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]、キャッシュキージェネレータ= HashCodeCacheKeyGenerator [includeMethod = true、includeParameterTypes = true、useRef com.googlecode.ehcache.annotations.impl.CacheAttributeSourceImpl.getMethodAttribute(CacheAttributeSourceImpl.java:174)でparameterMask [mask = []]] []を入力してください。インターセプタはautowiredサービスを呼び出すと

、それらの一方のみをキャッシュします:

[DEBUG]午前八時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 。ターゲットはクラス[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:com.googlecode.ehcache.annotations.interceptor.EhCacheInterceptor.generateCacheKeyで6.0.2)のGecko/20100101 Firefoxの/ 6.0.2](EhCacheInterceptor.java:272)

EDIT: 私がすべきおそらく、2つのサービスが異なるモジュールで定義されていると言えます。

答えて

3

それは理由がコンテキストに関連していたが判明しました。 キャッシュに失敗したサービスは、2つの異なるコンポーネントスキャンに含まれていました。私が解決するとすぐに、キャッシングは期待通りに機能しました。

3

2番目のメソッドを呼び出す方法は、OrganisationInfoServiceインターフェイス経由ですか?注釈は、インターフェイスを介してメソッドを呼び出すことに依存しているので、キャッシュを行うプロキシを生成することができます。

具体的なクラスを外部から直接呼び出す場合や、クラス内の別のメソッドから呼び出す場合は、注釈は機能しません。

参照はFAQに3と4の回答:コンポーネント・スキャン: http://code.google.com/p/ehcache-spring-annotations/wiki/FrequentlyAskedQuestions

+0

両方とも、それぞれのインターフェイスを通じて呼び出されます。 – Nicolai

+0

ええ、最初のキャッシュのtimeToLive値は、他のキャッシュ(86400s)と比較して300secです。これは、最後のアクセス時間に関係なく、キャッシュされたオブジェクトが5min後に追い出されることを意味します。物事はキャッシュされていないように見えます。それが理由だろうか? – Paolo

+0

現時点では、これをテストして、キャッシュされているかどうかを確認しています。呼び出しは数秒以内に行われます。キャッシュプロキシはEventServiceには決して使用されないので、私は推測する何らかの設定/構成の問題がなければなりません。 – Nicolai

関連する問題