|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
DSL 基础
org.springframework.integration.dsl 包包含前面提到的 IntegrationFlowBuilder API 以及多个 IntegrationComponentSpec 实现,这些实现同时也是构建器,并提供用于配置具体端点的流畅 API。
IntegrationFlowBuilder 基础设施为基于消息的应用程序提供通用的 企业集成模式(EIP),例如通道、端点、轮询器和通道拦截器。
- 重要
-
IntegrationComponentSpec是一个FactoryBean实现,因此其getObject()方法不得从 Bean 定义中调用。IntegrationComponentSpec实现必须保持原样以用于 Bean 定义,框架将管理其生命周期。 对于目标IntegrationComponentSpec类型(即FactoryBean值),Bean 定义应使用 Bean 方法参数注入,而不是 Bean 方法引用。
在 DSL 中,端点使用动词表示以提高可读性。 以下列表包含常见的 DSL 方法名称及其关联的 EIP 端点:
-
转换 →
Transformer -
过滤器 →
Filter -
处理 →
ServiceActivator -
拆分 →
Splitter -
聚合 →
Aggregator -
路由 →
Router -
桥接 →
Bridge
从概念上讲,集成流程是通过将这些端点组合成一个或多个消息流来构建的。
请注意,EIP 并未正式定义“消息流”这一术语,但将其视为使用已知消息模式的独立工作单元是有益的。
该 DSL 提供了一个 IntegrationFlow 组件用于定义通道及其之间端点的组合,但现在 IntegrationFlow 仅扮演配置角色,用于在应用上下文中填充实际的 Bean,而在运行时并不使用。
然而,IntegrationFlow 的 Bean 可以自动装配为 Lifecycle,以控制整个流程中的 start() 和 stop(),该流程将委托给与此 IntegrationFlow 关联的所有 Spring Integration 组件。
以下示例使用 IntegrationFlow 流畅 API,通过来自 IntegrationFlowBuilder 的 EIP 方法定义一个 IntegrationFlow Bean:
@Bean
public IntegrationFlow integerFlow() {
return IntegrationFlow.from("input")
.<String, Integer>transform(Integer::parseInt)
.get();
}
transform 方法接受一个 lambda 表达式作为端点参数,用于操作消息负载。
该方法的实际参数是一个 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();
}
上述示例组合了一个 Filter → Transformer → Service Activator 序列。
该流程是“单向”的。
也就是说,它不提供回复消息,仅将有效载荷打印到 STDOUT。
端点通过使用直接通道自动连接在一起。
|
Lambda 表达式和
Message<?> 个参数在使用 EIP 方法中的 lambda 表达式时,"input" 参数通常指消息负载。
如果您希望访问整个消息,请使用接受
由于 lambda 表达式未保留参数类型,且框架将尝试将负载强制转换为 相反,请使用:
|
|
Bean 定义覆盖
Java DSL 可以为流定义中内联定义的对象注册 Bean,也可以重用现有的注入的 Bean。
如果为内联对象和现有 Bean 定义定义了相同的 Bean 名称,将抛出 |