有入站http網關和出站http網關的spring集成應用,在那些我想要緩存的網關之間,以避免不必要的請求。我唯一的解決方案是在緩存和路由器之後添加攔截器,將攔截結果路由迴應答通道,並且不緩存到出站,但是這個解決方案對我來說似乎很棘手和難看。 當入站網關具有相同的請求和回覆通道時(當返回具有相同頭部但不同有效負載的新消息時,其被認爲是回覆)但是它不是我可以使用的情況時,具有緩存的攔截器也可以正常工作。Spring集成應用和緩存
對此有何更好的想法?
有入站http網關和出站http網關的spring集成應用,在那些我想要緩存的網關之間,以避免不必要的請求。我唯一的解決方案是在緩存和路由器之後添加攔截器,將攔截結果路由迴應答通道,並且不緩存到出站,但是這個解決方案對我來說似乎很棘手和難看。 當入站網關具有相同的請求和回覆通道時(當返回具有相同頭部但不同有效負載的新消息時,其被認爲是回覆)但是它不是我可以使用的情況時,具有緩存的攔截器也可以正常工作。Spring集成應用和緩存
對此有何更好的想法?
用<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*Message
是HttpRequestExecutingMessageHandler
handleRequestMessage
方法。正是爲了這個方法,Spring Integration應用了他的建議(例如RequestHandlerRetryAdvice
)。
在這裏,您應該配置一個cacheManager
bean,選擇緩存名稱並確定緩存條目的key
。在上面的示例中,#a0
是來自handleRequestMessage
參數的Message
對象。因此,您可以針對消息屬性(負載和標頭)指定任何SpEL表達式。 而handleRequestMessage
的結果將被存儲在緩存中。
而當您爲HTTP請求提供相同的參數時,結果將僅從緩存中返回。