2013-12-23 2 views
3

불일치 요청을 피하기 위해 캐시를 갖고 싶은 사람들 사이에 인바운드 http 게이트웨이 및 아웃 바운드 http 게이트웨이가있는 스프링 통합 응용 프로그램이 있어야합니다. 내가 가진 유일한 해결책은 캐시와 라우터를 가진 인터셉터를 추가 한 후 cahced 결과를 회신 채널에 다시 보내고 아웃 바운드에 캐싱하지 않는 것이지만이 솔루션은 나에게 까다롭고 추악한 것처럼 보입니다. 캐시가있는 인터셉터는 인바운드 게이트웨이에 요청 및 응답 (같은 헤더가 있지만 페이로드가 다른 새 메시지를 반환 할 때 해당 응답으로 간주 함) 채널을 가지고 있지만 사용할 수없는 경우에 유용합니다.스프링 통합 응용 프로그램 및 캐시

더 좋은 아이디어가 있습니까?

답변

5

더 우아한 솔루션은 <request-handler-advice-chain>Spring Cache Advice으로 얻을 수 있습니다.

그래서, 솔루션은 다음과 같이 할 수있다 : handle*MessageHttpRequestExecutingMessageHandlerhandleRequestMessage 방법이다

<int-http:outbound-gateway> 
    <int-http:request-handler-advice-chain> 
     <cache:advice> 
       <cache:caching cache="foo"> 
        <cache:cacheable method="handle*Message" key="#a0.payload"/> 
       </cache:caching> 
     </cache:advice> 
    </int-http:request-handler-advice-chain> 
</int-http:outbound-gateway> 

. 그리고이 방법의 경우 Spring Integration은 조언 (예 : RequestHandlerRetryAdvice)을 적용합니다.

여기에서 cacheManager 빈을 구성하고 캐시 이름을 선택하고 캐시 항목을 key으로 결정해야합니다. 위의 샘플에서 #a0은 인수의 Message 개체입니다. 따라서 메시지 속성 (페이로드 및 헤더)에 대해 SpEL 식을 지정할 수 있습니다. 그리고 handleRequestMessage의 결과는 캐시에 저장됩니다.

그리고 HTTP reqeust에 대해 동일한 매개 변수를 제공하면 결과가 캐시에서 반환됩니다.

관련 문제