使用消息流

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 为前缀,用于解析日志或在某些分析工具中将组件分组等目的,以及避免在运行时并发注册集成流时出现竞态条件。有关更多信息,请参阅 动态和运行时集成流