具有入站 http 网关和出站 http 网关的 spring 集成应用程序,我希望在它们之间拥有缓存,以避免不必要的请求。我唯一的解决方案是在它之后添加缓存和路由器的拦截器,将缓存的结果路由回回复 channel ,而不是缓存到出站,但这个解决方案对我来说似乎很棘手和丑陋。 当入站网关具有相同的请求和回复 channel 时,带缓存的拦截器也能正常工作(当返回具有相同 header 但有效负载不同的新消息时,它被视为回复)但我不能使用这种情况。
对此有更好的想法吗?
最佳答案
使用 <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
是handleRequestMessage
HttpRequestExecutingMessageHandler
的方法| .正是对于这种方法,Spring Integration 应用了他的建议(例如 RequestHandlerRetryAdvice
)。
在这里你应该配置一个cacheManager
bean,选择缓存名称并确定 key
用于缓存条目。在上面的示例中 #a0
是 Message
来自 handleRequestMessage
的对象争论。因此,您可以针对消息属性(有效负载和 header )指定任何 SpEL 表达式。
handleRequestMessage
的结果将存储在缓存中。
当您为 HTTP 请求提供相同的参数时,结果将只从缓存中返回。
关于java - Spring集成应用和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20746635/