Integration Flows Composition

随着 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 定义自动装配。