如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

使用消息流

IntegrationFlowBuilder 提供了一个顶级 API,用于生成集成组件并将其连接到消息流。 当您的集成可以通过单个流完成时(这通常是情况),这将非常方便。 或者,IntegrationFlow 实例可以通过 MessageChannel 实例进行连接。spring-doc.cadn.net.cn

默认情况下,MessageFlow 在 Spring Integration 术语中表现为“链”。 也就是说,端点由 DirectChannel 实例自动且隐式地连接。 消息流实际上并非构建为链,这提供了更大的灵活性。 例如,如果您知道某个组件的 inputChannel 名称(即您显式定义了它),您可以向该流中的任何组件发送消息。 您还可以在流中引用外部定义的通道,以使用通道适配器(启用远程传输协议、文件 I/O 等),而不是直接使用通道。 因此,DSL 不支持 Spring Integration 的 chain 元素,因为在这种情况下它并未增加太多价值。spring-doc.cadn.net.cn

由于 Spring Integration Java DSL 产生的 Bean 定义模型与其他任何配置选项相同,并且基于现有的 Spring Framework @Configuration 基础设施,因此它可以与 XML 定义一起使用,并与 Spring Integration 消息注解配置进行连接。spring-doc.cadn.net.cn

您也可以使用 lambda 定义直接的 IntegrationFlow 实例。 以下示例展示了如何实现:spring-doc.cadn.net.cn

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

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

从版本 5.1 开始,此类 IntegrationFlow 被包装到代理中,以暴露生命周期控制并提供对内部关联的 StandardIntegrationFlowinputChannel 的访问。spring-doc.cadn.net.cn

从版本 5 开始。0.6,IntegrationFlow 中组件生成的 Bean 名称包括流程 Bean,后跟一个点(.)作为前缀。例如,前文示例中 .transform("Hello "::concat)ConsumerEndpointFactoryBean 会导致生成名为 lambdaFlow.o.s.i.config.ConsumerEndpointFactoryBean#0 的 Bean。(o.s.iorg.springframework.integration 的简化形式,以便适应页面显示。该端点的 Transformer 实现 Bean 的 Bean 名称为 lambdaFlow.transformer#0(从版本 5 开始)。1),其中不使用MethodInvokingTransformer类的完全限定名称,而是使用其组件类型。当在流程中生成 bean 名称时,所有 NamedComponent 都应用相同的模式。这些生成的 Bean 名称以前缀形式添加流程 ID,目的是用于解析日志或在某些分析工具中将组件分组,同时避免在运行时并发注册集成流程时出现竞态条件。请参阅 动态和运行时集成流程 以获取更多信息。spring-doc.cadn.net.cn