集成流组合
随着MessageChannel抽象在Spring Integration中成为一等公民,集成流的组合始终被纳入考量。流程中任何端点的输入通道都可用于接收来自其他端点的消息,而不仅限于将其作为输出通道的端点。此外,通过@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 定义中自动装配即可。