集成流组合
在 Spring Integration 中,MessageChannel
抽象作为一等公民,集成流程的组合始终是被假定的。流程中任何端点的输入通道都可以用来从任何其他端点发送消息,而不仅仅是从拥有该通道作为输出的端点发送消息。此外,使用@MessagingGateway
契约、内容丰富器组件、像<chain>
这样的复合端点,以及现在的IntegrationFlow
bean(例如IntegrationFlowAdapter
),可以很容易地将业务逻辑分布到更短、可重用的部分中。最终组合所需的一切只是关于要发送到或接收自的MessageChannel
的知识。
从5.5.4
版本开始,为了更多地从MessageChannel
中抽象出来,并向最终用户隐藏实现细节,IntegrationFlow
引入了from(IntegrationFlow)
工厂方法,允许从现有流程的输出启动当前IntegrationFlow
。
@Bean
IntegrationFlow templateSourceFlow() {
return IntegrationFlow.fromSupplier(() -> "test data")
.channel("sourceChannel")
.get();
}
@Bean
IntegrationFlow compositionMainFlow(IntegrationFlow templateSourceFlow) {
return IntegrationFlow.from(templateSourceFlow)
.<String, String>transform(String::toUpperCase)
.channel(c -> c.queue("compositionMainFlowResult"))
.get();
}
另一方面,IntegrationFlowDefinition
添加了一个to(IntegrationFlow)
终端操作符,用于在其他某个流程的输入通道处继续当前流程。
@Bean
IntegrationFlow mainFlow(IntegrationFlow otherFlow) {
return f -> f
.<String, String>transform(String::toUpperCase)
.to(otherFlow);
}
@Bean
IntegrationFlow otherFlow() {
return f -> f
.<String, String>transform(p -> p + " from other flow")
.channel(c -> c.queue("otherFlowResultChannel"));
}
流程中间的组合可以通过现有的gateway(IntegrationFlow)
EIP 方法轻松实现。通过这种方式,我们可以通过将更简单、可重用的逻辑块组合起来,构建任何复杂度的流程。例如,您可以将IntegrationFlow
bean 的库添加为依赖项,只需将它们的配置类导入到最终项目中并自动连接到您的IntegrationFlow
定义即可。