具有多个出站HTTP调用的流

时间:2016-07-18 03:21:31

标签: spring-integration

我们有一个包含订单项的购物车域名模型。在外部,我们有一个API来检查购物车。但在内部,我们有3种不同的HTTP服务:

  1. 创建购物车
  2. 添加订单项 - 每个订单项一次HTTP调用
  3. 结帐
  4. 我们想在集成流程中表达这一点,如果任何步骤失败或超时,则中止。以下是流程的一些伪代码:

     @Bean
    public IntegrationFlow cartFlow() {
        return IntegrationFlows.from(channel())
                .transform(fromJson(ShoppingCart.class))
                .handle(Http.outboundGateway(.....) // How do we proceed here to create a shopping cart?
                .split(ShoppingCart.class, ShoppingCart::getLineItems)
                .handle(Http.outboundGateway(.....) // And here to add each line item?
                .aggregate()
                .handle(Http.outboundGateway(.....) // And here to checkout
                .get();
    }
    

    添加Http.outboundGateway调用不是问题。问题实际上是关于保留上下文(关于HTTP方法调用后的ShoppingCart)。除确认呼叫成功之外,服务不会返回任何数据。

    我理解的一个选项是创建一个自定义bean,它进行HTTP调用并将其注入管道。这种方法对我来说并不是很惯用。

    谢谢!

1 个答案:

答案 0 :(得分:1)

您的用例完全适合Content Enricher pattern,您可以使用payload调用某些外部服务(通过request-channel上的网关),等待对于回复并将一些内容添加到原始payload

对于您的用例,您可能需要几个重要的.enrich()定义。

另请参阅Spring Integration Content Enricher definition以获取更多信息。

修改

ContentEnricher示例:

@Bean
public IntegrationFlow enricherFlow() {
    return IntegrationFlows.from("enricherInput", true)
            .enrich(e -> e.requestChannel("enrichChannel")
                    .requestPayloadExpression("payload")
                    .shouldClonePayload(false)
                    .propertyExpression("name", "payload['name']")
                    .propertyFunction("date", m -> new Date())
                    .headerExpression("foo", "payload['name']")
            )
            .get();
}