使用消息流

IntegrationFlowBuilder 提供了一个顶层 API 来生成连接到消息流的集成组件。当您的集成可以使用单个流完成时(这通常是这种情况),这很方便。或者,IntegrationFlow 实例可以通过 MessageChannel 实例连接。

默认情况下,MessageFlow 在 Spring Integration 中的行为类似于“链”。也就是说,端点通过 DirectChannel 实例自动且隐式地连接。消息流实际上并没有构建成链,这提供了更大的灵活性。例如,如果您知道其 inputChannel 名称(即,如果您显式定义它),则可以将消息发送到流中的任何组件。您也可以在流中引用外部定义的通道,以允许使用通道适配器(以启用远程传输协议、文件 I/O 等),而不是直接通道。因此,DSL 不支持 Spring Integration chain 元素,因为它在这种情况下没有太大价值。

由于 Spring Integration Java DSL 生成与任何其他配置选项相同的 Bean 定义模型,并且基于现有的 Spring Framework @Configuration 基础结构,因此它可以与 XML 定义一起使用,并与 Spring Integration 消息注释配置连接。

您还可以使用 lambda 定义直接的 IntegrationFlow 实例。以下示例展示了如何做到这一点

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

此定义的结果是相同的一组集成组件,这些组件通过隐式直接通道连接。这里唯一的限制是此流以命名直接通道启动 - lambdaFlow.input。此外,Lambda 流不能从 MessageSourceMessageProducer 开始。

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

从版本 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 为前缀,用于解析日志或将组件分组到某些分析工具中,以及避免在运行时同时注册集成流时发生竞争条件。有关更多信息,请参见 动态和运行时集成流