Groovy DSL系列
Groovy DSL
Groovy DSL 是 Java DSL 的包装器和扩展。 我们在这里追求的主要目标是通过与现有 Java DSL 和一些 Groovy 扩展或特定于语言的结构的互作性,使 Groovy 上的 Spring 集成开发尽可能顺利和直接。 该实现是 Groovy Support 模块的一部分。
您只需导入import static org.springframework.integration.groovy.dsl.IntegrationGroovyDsl.integrationFlow
- 一个包含 Groovy DSL 的重载工厂方法的类。
为IntegrationFlow
定义作为 lambda,我们通常不需要 Groovy 提供任何其他内容,只需声明一个 bean,如下所示:
@Bean
IntegrationFlow oddFlow() {
{ IntegrationFlowDefinition flow ->
flow.handle(Object, { p, h -> 'odd' })
}
}
在这种情况下,Groovy 理解 this close 应该被转换为IntegrationFlow
anonymous 实例和目标 Java DSL 处理器将此构造正确解析为 Java 对象。
作为上述结构的替代方案,并且为了与下面解释的用例保持一致,spring-integration-groovy
module 提供了一个特定于 Groovy 的 DSL,用于以构建器模式样式声明集成流:
@Bean
flowLambda() {
integrationFlow {
filter String, { it == 'test' }, { id 'filterEndpoint' }
wireTap integrationFlow {
channel { queue 'wireTapChannel' }
}
delay 'delayGroup', { defaultDelay 100 }
transform String, { it.toUpperCase() }
}
}
这样一个全球性的integrationFlow()
函数需要一个 builder 样式的闭包。GroovyIntegrationFlowDefinition
(用于IntegrationFlowDefinition
) 并生成一个常规的IntegrationFlow
Lambda 实现。
查看更多超载integrationFlow()
变体。
许多其他场景都需要IntegrationFlow
从数据源开始(例如JdbcPollingChannelAdapter
,JmsInboundGateway
或者只是一个现有的MessageChannel
).
为此,Spring 集成 Java DSL 提供了一个IntegrationFlow
工厂有若干个超载from()
方法。
这个工厂也可以用在 groovy 中:
@Bean
flowFromSupplier() {
IntegrationFlow.fromSupplier({ 'bar' }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
.channel({ c -> c.queue('fromSupplierQueue') } as Function)
.get()
}
但不幸的是,并非全部from()
方法与 Groovy 结构兼容。
为了解决这个问题, Spring Integration 提供了一个围绕IntegrationFlows
厂。
它被实现为一组重载的integrationFlow()
功能。
使用使用者进行GroovyIntegrationFlowDefinition
将流的其余部分声明为IntegrationFlow
closure 来重用上述体验,并且还避免了对get()
通话。
例如:
@Bean
functionFlow() {
integrationFlow Function<byte[], String>,
{ beanName 'functionGateway' },
{
transform Transformers.objectToString(), { id 'objectToStringTransformer' }
transform String, { it.toUpperCase() }
split Message<?>, { it.payload }
split Object, { it }, { id 'splitterEndpoint' }
resequence()
aggregate {
id 'aggregator'
outputProcessor { it.one }
}
}
}
@Bean
someFlow() {
integrationFlow ({ 'test' },
{
poller { it.trigger new OnlyOnceTrigger() }
id 'pollingSource'
})
{
log LoggingHandler.Level.WARN, 'test.category'
channel { queue 'pollerResultChannel' }
}
}