Groovy DSL系列
酷炫DSL
Groovy DSL 是 Java DSL 的包装器和扩展。 我们在这里的主要目标是让Groovy上的Spring Integration开发尽可能顺畅直接,并实现与现有Java DSL及某些Groovy扩展或特定语言结构的互作性。 该实现是Groovy Support模块的一部分。
你只需要导入一个import static org.springframework.integration.groovy.dsl.IntegrationGroovyDsl.integrationFlow- 包含Groovy DSL过载工厂方法的类。
为集成流程作为lambda的定义,我们通常不需要Groovy的其他内容,只需声明这样一个豆子:
@Bean
IntegrationFlow oddFlow() {
{ IntegrationFlowDefinition flow ->
flow.handle(Object, { p, h -> 'odd' })
}
}
在这种情况下,Groovy 理解闭包应被翻译为集成流程匿名实例和目标Java DSL处理器会正确解析该结构,生成Java对象。
作为上述构造的替代方案,并为与下面解释的用例保持一致,以下Spring积分律动模块提供了一个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()函数期望构建者风格的闭包对于GroovyIntegrationFlowDefinition(Groovy的包装纸集成流程定义) 并产生一个正则集成流程lambda实现。
更多超载integrationFlow()以下为变体。
许多其他情景需要集成流程从数据源开始(例如:JdbcPollingChannel适配器,JmsInboundGateway或者只是一个现有的消息频道).
为此,Spring Integration Java DSL 提供了集成流程工厂中有多台超载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 提供了一个围绕集成流程厂。
它被实现为一组超载integrationFlow()功能。
与消费者有关GroovyIntegrationFlowDefinition将剩余的流声明为集成流程关闭以重用上述经历,同时避免需要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' }
}
}