使用消息流
IntegrationFlowBuilder
提供了一个顶级 API 用于生成连接到消息流的集成组件。当您的集成可以通过单个流完成时(通常情况下),这非常方便。或者,可以通过 MessageChannel
实例连接 IntegrationFlow
实例。
默认情况下,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 流不能从 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 作为前缀,用于解析日志或在某些分析工具中将组件组合在一起,以及在我们在运行时并发注册集成流时避免竞争条件。有关更多信息,请参阅 动态和运行时集成流。