java - Spring集成应用和缓存

标签 java spring spring-integration

具有入站 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*MessagehandleRequestMessage HttpRequestExecutingMessageHandler的方法| .正是对于这种方法,Spring Integration 应用了他的建议(例如 RequestHandlerRetryAdvice)。

在这里你应该配置一个cacheManager bean,选择缓存名称并确定 key用于缓存条目。在上面的示例中 #a0Message来自 handleRequestMessage 的对象争论。因此,您可以针对消息属性(有效负载和 header )指定任何 SpEL 表达式。 handleRequestMessage的结果将存储在缓存中。

当您为 HTTP 请求提供相同的参数时,结果将只从缓存中返回。

关于java - Spring集成应用和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20746635/

相关文章:

java - 如何动态更新 Android 应用程序?

java - 如何覆盖 Java 中的方法,但仍然具有父方法的部分功能

java - Apache Jax-RS 破坏了 spring-integration-mail

hibernate - 想用 HQL 只获取 5 条记录

java - Spring Integration EnableIntegrationManagement 加上 MetricRegistry

java - 使用 Spring AMQP 出站网关发送消息 header

java - 十进制值问题

java - 如何使用另一个 JButton 关闭一个 JButton

java - Spring MVC、Spring 安全 : Unable to load login template

java - Spring @Async 抽象在异常处理方面存在漏洞