我们有一个包含订单项的购物车域名模型。在外部,我们有一个API来检查购物车。但在内部,我们有3种不同的HTTP服务:
我们想在集成流程中表达这一点,如果任何步骤失败或超时,则中止。以下是流程的一些伪代码:
@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调用并将其注入管道。这种方法对我来说并不是很惯用。
谢谢!
答案 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();
}