2013-12-23 61 views
3

有入站http網關和出站http網關的spring集成應用,在那些我想要緩存的網關之間,以避免不必要的請求。我唯一的解決方案是在緩存和路由器之後添加攔截器,將攔截結果路由迴應答通道,並且不緩存到出站,但是這個解決方案對我來說似乎很棘手和難看。 當入站網關具有相同的請求和回覆通道時(當返回具有相同頭部但不同有效負載的新消息時,其被認爲是回覆)但是它不是我可以使用的情況時,具有緩存的攔截器也可以正常工作。Spring集成應用和緩存

對此有何更好的想法?

回答

5

<request-handler-advice-chain>Spring Cache Advice可以實現更優雅的解決方案。

所以,您的解決方案可能是這樣的:

<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> 

handle*MessageHttpRequestExecutingMessageHandlerhandleRequestMessage方法。正是爲了這個方法,Spring Integration應用了他的建議(例如RequestHandlerRetryAdvice)。

在這裏,您應該配置一個cacheManager bean,選擇緩存名稱並確定緩存條目的key。在上面的示例中,#a0是來自handleRequestMessage參數的Message對象。因此,您可以針對消息屬性(負載和標頭)指定任何SpEL表達式。 而handleRequestMessage的結果將被存儲在緩存中。

而當您爲HTTP請求提供相同的參數時,結果將僅從緩存中返回。