2016-12-29 7 views
2

주석을 사용하여 기존 스프링 프로젝트에 Spring Cache를 추가하고 있습니다. 캐시 제공 업체로 Couchbase를 사용하고 있습니다. AspectJ를 사용하여로드 시간 짜기를 사용하여 private 메소드 호출과 case 클래스 메소드 호출을 캐시 할 수있게하려고한다.LoadTimeWeaving을 사용하는 Couchbase의 스프링 캐시 - 이상하게 작동하지 않습니다.

3 일이 지났습니다.이 문제에 봉착했으며 수십 개의 기사, 문서 및 예제를 읽었지만이 기능은 작동하지 않습니다.

이 내가 무슨 짓을했는지입니다 -

@Configuration 
@EnableSpringConfigured 
@EnableAspectJAutoProxy 
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) 
@EnableTransactionManagement 
@EnableRetry 
@PropertySource(
     value = {"classpath:application.properties", "classpath:${spring.profiles.active}.properties"}, 
     ignoreResourceNotFound = true) 
public class BeanConfig implements LoadTimeWeavingConfigurer { 

    ... various beans here ... 

    @Override 
    public LoadTimeWeaver getLoadTimeWeaver() { 
     return new TomcatLoadTimeWeaver();// because I'm using Tomcat 7 
    } 

    @Bean 
    public InstrumentationLoadTimeWeaver loadTimeWeaver() throws Throwable { 
     return new InstrumentationLoadTimeWeaver(); 
    } 
} 

@Configuration 
@EnableSpringConfigured 
@EnableCaching(mode = AdviceMode.ASPECTJ) 
@ComponentScan(basePackages = "com.foo.bar.dao.cache.couchbase") 
public class CacheConfigurer extends CachingConfigurerSupport { 
    @Bean 
    @Override 
    public CacheManager cacheManager() { 
     ... cachemanager configuration here ... 
    } 
} 

은 그럼 클래스가 아닌 인터페이스에 DAO 방법에 @Chacheable 있습니다.

마지막으로, 내 톰캣 7의 $ CATALINA_HOME/conf의/context.xml에에 내가 가진 -

  • -

    <Context> 
        <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>  
    </Context> 
    

    나는의 pom.xml에 의존성 (그 받는다는 프로젝트) 다음 추가 카우치베이스 주식회사 스프링 캐시

  • 스프링 양태
  • aspectjrt aspectjweaver
  • 봄 악기
  • 스프링 악기 바람둥이

내가 사용하지 않는 경우 LTW 캐싱 (예상대로) 인터페이스를 통해 도착하는 호출 방법에 대해 잘 작동합니다. 하지만 LTW를 활성화 한 후에는 캐싱이 전혀 작동하지 않습니다. 어떤 메서드 호출도 캐싱하지 않고 오류도 발생하지 않습니다.

누구나 couchbase로 스프링 캐시 용 LTW를 사용 해본 적이 있습니까? 나는 여기서 무엇을 놓치고 잘못 했는가?

저는 봄 4.3.5에 있습니다. 출시.

업데이트 -

여기에 상황을 복제 내 베어 최소한의 코드 - https://github.com/harshilsharma63/spring-boilerplate-with-cache

+0

정말로 couchbase와 관련이 없으며 공급자는 중요하지 않습니다. 당신은 메모리 저장소에서 이것을 복제 할 수 있어야합니다. 분명히 나에게 점프하는 것은 잘못된 것이 없다. LTW가없는 구현에서는'@ Cacheable'을 사용할 수 있습니다. 그런데 private 메소드가 아니라. –

+0

JVM 인수로'-javaagent :/path/to/aspectjweaver.jar'을 사용할 수 없습니까? 그렇지 않다면 필요한 클래스 로더 매직 대신? –

+0

아니면 컴파일 타임 직조를 사용하십시오. 애플리케이션 관리의 AspectJ를 이미 사용하고 있기 때문에 애플리케이션의 선택적 기능은 아니기 때문에 애플리케이션 런타임에서 짜는 부분을 빌드에 가져 와서 애플리케이션을 단순화 할 수있다. –

답변

1

특히 톰캣 < 8.0, 클래스 로더 기반로드 시간 직물을 잊어가. 클래스로드 순서와 관련하여 많은 문제가있을 것입니다. 스프링이 직조 클래스 로더를 설치하기 전에 일부 클래스가로드되고, 클래스가 작성되지 않은 클래스 일부를 디버그하기 어렵게 될 것입니다. 대신 Java 에이전트를 사용하십시오.

여기에 자바 에이전트 기반의 직물로 전환하여 톰캣 7 귀하의 설정을 수정하는 방법은 다음과 같습니다

  1. @EnableLoadTimeWeaving 주석을 제거합니다.
  2. <Loader loaderClass...context.xml에서 삭제하십시오.
  3. -javaagent:/path/to/aspectjweaver.jar을 JVM 시작 인수에 추가하십시오.톰캣 8로 이동하고자하는 경우

, 여기에 필요한 단계는 다음과 같습니다 별도의 구성 클래스에

  1. 이동 @EnableLoadTimeWeaving(aspectjWeaving=ENABLED),의는 WeavingConfig 이름을 수 있습니다.
  2. WebInitializer 클래스를 변경하여 getRootConfigClasses()의 경우에만 WeavingConfig.class을 반환합니다.
  3. 다른 필수 구성 클래스를 getServletConfigClasses()으로 옮깁니다.
  4. <Loader loaderClass...과 같은 편집되지 않은 구성을 context.xml, @EnableAspectJAutoProxy에서 제거하십시오.
  5. 이익.

물론 컴파일 타임을 사용하는 것이 가장 좋습니다.

+0

"여전히 컴파일 시간 짜기를 사용하는 것이 가장 좋습니다." - 컴파일 시간 짜기가 여전히 가장 좋은 이유는 무엇입니까? –

+0

또한 스프링 문서가 제안한 것과 크게 다른 이유는 무엇입니까? –

+0

컴파일 타임 위빙에서는로드 시간에서 빌드 시간으로 위빙의 성능 저하를 이동하므로 시작 시간이 빨라집니다. Java 에이전트를 추가하거나 클래스 로더 동작을 수정하는 것과 같이 대상 시스템의 런타임 등록 정보를 수정하지 않아도됩니다. LTW가 작동하지 않는 이유가있을 경우, 런타임시에만 분명히 알 수 있기 때문에, 더 안전합니다. 빌드에 짜기를 포함 시키면 문제가되지 않습니다. 대체로 LTW는 LTW보다 안전하고 안정적인 대안입니다. –