使用消息流
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 流不能从 MessageSource
或 MessageProducer
开始。
从 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.i
是 org.springframework.integration
的缩写,以便适应页面显示。)该端点的 Transformer
实现 bean 的 bean 名称为 lambdaFlow.transformer#0
(从 5.1 版本开始),其中使用了其组件类型,而不是 MethodInvokingTransformer
类的完全限定名。当需要在流中生成 bean 名称时,所有 NamedComponent
都应用相同的模式。这些生成的 bean 名称以流 ID 为前缀,用于解析日志或在某些分析工具中将组件分组,以及避免在运行时并发注册集成流时出现竞争条件。有关更多信息,请参阅动态与运行时集成流。