私は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つのサービスが異なるモジュールで定義されていると言えます。
両方とも、それぞれのインターフェイスを通じて呼び出されます。 – Nicolai
ええ、最初のキャッシュのtimeToLive値は、他のキャッシュ(86400s)と比較して300secです。これは、最後のアクセス時間に関係なく、キャッシュされたオブジェクトが5min後に追い出されることを意味します。物事はキャッシュされていないように見えます。それが理由だろうか? – Paolo
現時点では、これをテストして、キャッシュされているかどうかを確認しています。呼び出しは数秒以内に行われます。キャッシュプロキシはEventServiceには決して使用されないので、私は推測する何らかの設定/構成の問題がなければなりません。 – Nicolai