使用消息流

IntegrationFlowBuilder 提供了一个顶级 API,用于生成连接到消息流的集成组件。当你的集成可以通过单个流完成时(通常如此),这会很方便。或者,IntegrationFlow 实例可以通过 MessageChannel 实例连接。

默认情况下,MessageFlow 在 Spring 集成术语中表现为“链” (chain)。也就是说,端点由 DirectChannel 实例自动隐式连接。消息流实际上并非构造为链,这提供了更大的灵活性。例如,如果你知道其 inputChannel 名称(即,如果你明确定义了它),你可以向流中的任何组件发送消息。你还可以在流中引用外部定义的通道,以允许使用通道适配器(例如,启用远程传输协议、文件 I/O 等),而不是直接通道。因此,DSL 不支持 Spring 集成 chain 元素,因为它在此情况下并没有增加太多价值。

由于 Spring 集成 Java DSL 生成的 bean 定义模型与任何其他配置选项相同,并且基于现有的 Spring Framework @Configuration 基础设施,因此可以与 XML 定义一起使用,并与 Spring 集成消息处理注解配置结合。

你也可以使用 lambda 定义直接的 IntegrationFlow 实例。以下示例展示了如何实现

@Bean
public IntegrationFlow lambdaFlow() {
    return f -> f.filter("World"::equals)
                   .transform("Hello "::concat)
                   .handle(System.out::println);
}

此定义的결果是与隐式 direct channel 连接的同一组集成组件。唯一的限制是此流以一个命名 direct channel - lambdaFlow.input 启动。此外,Lambda 流不能从 MessageSourceMessageProducer 开始。

从 5.1 版本开始,这种类型的 IntegrationFlow 被包装到代理中,以暴露生命周期控制并提供对其内部关联的 StandardIntegrationFlow 的 inputChannel 的访问。

从 5.0.6 版本开始,IntegrationFlow 中组件生成的 bean 名称包含流 bean,后跟一个点 (.) 作为前缀。例如,前一个示例中 .transform("Hello "::concat)ConsumerEndpointFactoryBean 生成的 bean 名称为 lambdaFlow.o.s.i.config.ConsumerEndpointFactoryBean#0。(o.s.iorg.springframework.integration 的缩写,以便适应页面显示。)该端点的 Transformer 实现 bean 的 bean 名称为 lambdaFlow.transformer#0(从 5.1 版本开始),其中使用了其组件类型,而不是 MethodInvokingTransformer 类的完全限定名。当需要在流中生成 bean 名称时,所有 NamedComponent 都应用相同的模式。这些生成的 bean 名称以流 ID 为前缀,用于解析日志或在某些分析工具中将组件分组,以及避免在运行时并发注册集成流时出现竞争条件。有关更多信息,请参阅动态与运行时集成流