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