此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1! |
该包包含前面提到的 API 和许多实现,这些实现也是构建器,并提供 Fluent API 来配置具体端点。
基础架构为基于消息的应用程序(如通道、端点、轮询器和通道拦截器)提供通用的企业集成模式 (EIP)。org.springframework.integration.dsl
IntegrationFlowBuilder
IntegrationComponentSpec
IntegrationFlowBuilder
- 重要
-
是一个实现,因此不能从 Bean 定义中调用它的方法。 对于 Bean 定义,实现必须保持原样,框架将管理其生命周期。 目标类型(值)的 Bean 方法参数注入必须用于 Bean 定义,而不是 Bean 方法引用。
IntegrationComponentSpec
FactoryBean
getObject()
IntegrationComponentSpec
IntegrationComponentSpec
FactoryBean
IntegrationFlow
端点在 DSL 中表示为谓词,以提高可读性。 以下列表包括通用 DSL 方法名称和关联的 EIP 终端节点:
-
转换→
Transformer
-
筛选→
Filter
-
手柄→
ServiceActivator
-
拆分→
Splitter
-
聚合→
Aggregator
-
路线 →
Router
-
桥梁→
Bridge
从概念上讲,集成过程是通过将这些端点组合到一个或多个消息流中来构造的。
请注意,EIP 没有正式定义术语“消息流”,但将其视为使用众所周知的消息传递模式的工作单元很有用。
DSL 提供了一个组件来定义通道和它们之间的端点的组成,但现在只扮演配置角色以在应用程序上下文中填充真正的 Bean,并且在运行时不使用。
但是,bean for 可以自动连接为控制和整个流,该流被委托给与此相关的所有 Spring Integration 组件。
以下示例使用 fluent API 通过 EIP-methods 定义 Bean:IntegrationFlow
IntegrationFlow
IntegrationFlow
Lifecycle
start()
stop()
IntegrationFlow
IntegrationFlow
IntegrationFlow
IntegrationFlowBuilder
@Bean
public IntegrationFlow integerFlow() {
return IntegrationFlow.from("input")
.<String, Integer>transform(Integer::parseInt)
.get();
}
该方法接受 lambda 作为终端节点参数,以对消息负载进行操作。
此方法的真正参数是一个实例。
因此,任何提供的变压器(、 和其他)都可以在这里使用。transform
GenericTransformer<S, T>
ObjectToJsonTransformer
FileToStringTransformer
在后盖下,分别用 和 识别它的端点。
请看另一个例子:IntegrationFlowBuilder
MessageHandler
MessageTransformingHandler
ConsumerEndpointFactoryBean
@Bean
public IntegrationFlow myFlow() {
return IntegrationFlow.from("input")
.filter("World"::equals)
.transform("Hello "::concat)
.handle(System.out::println)
.get();
}
前面的示例组成了 的序列。
流程是“单向”。
也就是说,它不提供回复消息,而只是将有效负载打印到 STDOUT。
使用直接通道自动将端点连接在一起。Filter → Transformer → Service Activator
Lambda 和参数
Message<?> 在 EIP 方法中使用 lambda 时,“input”参数通常是消息负载。
如果要访问整个消息,请使用将 a 作为第一个参数的重载方法之一。
例如,这不起作用:
这将在运行时失败,因为 lambda 不保留参数类型,并且框架将尝试将有效负载强制转换为 . 请改用:
|
Lambda 和参数
Message<?> 在 EIP 方法中使用 lambda 时,“input”参数通常是消息负载。
如果要访问整个消息,请使用将 a 作为第一个参数的重载方法之一。
例如,这不起作用:
这将在运行时失败,因为 lambda 不保留参数类型,并且框架将尝试将有效负载强制转换为 . 请改用:
|
Bean 定义覆盖
Java DSL 可以为流定义中内联定义的对象注册 Bean,也可以重用现有的注入 Bean。
如果为内联对象定义的 Bean 名称与现有 Bean 定义相同,则会抛出 a 表示此类配置错误。
但是,当您处理 Bean 时,无法从集成流处理器中检测现有的 Bean 定义,因为每次我们从 Bean 调用 Bean 时,我们都会得到一个新实例。
这样,提供的实例就可以按原样使用,而无需任何 Bean 注册和对现有 Bean 定义进行任何可能的检查。
但是,如果该对象具有显式且此名称的 Bean 定义在范围内,则会为此对象调用该对象。 |
Bean 定义覆盖
Java DSL 可以为流定义中内联定义的对象注册 Bean,也可以重用现有的注入 Bean。
如果为内联对象定义的 Bean 名称与现有 Bean 定义相同,则会抛出 a 表示此类配置错误。
但是,当您处理 Bean 时,无法从集成流处理器中检测现有的 Bean 定义,因为每次我们从 Bean 调用 Bean 时,我们都会得到一个新实例。
这样,提供的实例就可以按原样使用,而无需任何 Bean 注册和对现有 Bean 定义进行任何可能的检查。
但是,如果该对象具有显式且此名称的 Bean 定义在范围内,则会为此对象调用该对象。 |