DSL 基础知识
该包包含前面提到的 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 Endpoint:
-
转换→
Transformer
-
筛选→
Filter
-
手柄 →
ServiceActivator
-
拆分→
Splitter
-
聚合→
Aggregator
-
路线 →
Router
-
桥接→
Bridge
从概念上讲,集成流程是通过将这些端点组合成一个或多个消息流来构建的。
请注意,EIP 并未正式定义术语“消息流”,但将其视为使用众所周知的消息传递模式的工作单元会很有用。
DSL 提供了一个组件来定义通道和它们之间的端点的组合,但现在只扮演配置角色,在应用程序上下文中填充真实的 bean,并且在运行时不使用。
但是,bean for 可以自动连接为 to control 和 for 整个 flow,它被委托给与此关联的所有 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 作为第一个参数的重载方法之一。
例如,this 将不起作用:
这在运行时将失败,因为 lambda 不保留参数类型,并且框架将尝试将有效负载转换为 . 相反,请使用:
|
Bean 定义覆盖
Java DSL 可以为流定义中内联定义的对象注册 bean,也可以重用现有的注入的 bean。
如果为内联对象和现有 bean 定义定义了相同的 bean 名称,则会抛出 a,指示此类配置是错误的。
但是,在处理 bean 时,无法从集成流处理器中检测现有的 bean 定义,因为每次我们从 调用 bean 时,都会得到一个新实例。
这样,提供的实例就可以按原样使用,而无需任何 bean 注册,也不需要对现有 bean 定义进行任何可能的检查。
但是,如果此对象具有显式,并且此名称的 bean 定义在范围内,则为此对象调用。 |