Spring Integration (集成)Groovy DSL_Groovy

Groovy DSL是​​Java DSL​​​的包装器和扩展。 我们在这里追求的主要目标是使Groovy上的Spring Integration开发尽可能顺利和直接,并与现有的Java DSL和一些Groovy扩展或特定于语言的结构进行互操作性。 该实现是​​Groovy支持​​模块的一部分。

您只需要导入一个包含 Groovy DSL 重载工厂方法的类。​​import static org.springframework.integration.groovy.dsl.IntegrationGroovyDsl.integrationFlow​

对于 lambda 的定义,我们通常不需要 Groovy 的其他任何东西,只需像这样声明一个 bean:​​IntegrationFlow​

@Bean
IntegrationFlow oddFlow() {
{ IntegrationFlowDefinition flow ->
flow.handle(Object, { p, h -> 'odd' })
}
}

在这种情况下,Groovy理解闭包应该转换为匿名实例,目标Java DSL处理器将此构造正确解析为Java对象。​​IntegrationFlow​

作为上述构造的替代方案,并且为了与下面解释的用例保持一致,该模块提供了一个特定于 Groovy 的 DSL,用于以构建器模式样式声明集成流:​​spring-integration-groovy​

@Bean
flowLambda() {
integrationFlow {
filter String, { it == 'test' }, { id 'filterEndpoint' }
wireTap integrationFlow {
channel { queue 'wireTapChannel' }
}
delay 'delayGroup', { defaultDelay 100 }
transform String, { it.toUpperCase() }
}
}

这样的全局函数期望 a(一个 Groovy 包装器)的构建器风格的闭包,并生成一个常规的 lambda 实现。 请参阅下面的更多重载变体。​​integrationFlow()​​​​GroovyIntegrationFlowDefinition​​​​IntegrationFlowDefinition​​​​IntegrationFlow​​​​integrationFlow()​

许多其他场景需要从数据源(例如,或只是一个现有的)启动anto。 为此,Spring Integration Java DSL为工厂提供了许多重载方法。 这个工厂也可以用于时髦:​​IntegrationFlow​​​​JdbcPollingChannelAdapter​​​​JmsInboundGateway​​​​MessageChannel​​​​IntegrationFlow​​​​from()​

@Bean
flowFromSupplier() {
IntegrationFlow.fromSupplier({ 'bar' }) { e -> e.poller { p -> p.fixedDelay(10).maxMessagesPerPoll(1) } }
.channel({ c -> c.queue('fromSupplierQueue') } as Function)
.get()
}

但不幸的是,并非所有方法都与Groovy结构兼容。 为了解决这个问题,Spring Integration在工厂周围提供了一个Groovy DSL工厂。 它作为一组重载函数实现。 ato 的使用者将流的其余部分声明为闭包,以重用上述体验,并最终避免对 acall 的需求。 例如:​​from()​​​​IntegrationFlows​​​​integrationFlow()​​​​GroovyIntegrationFlowDefinition​​​​IntegrationFlow​​​​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' }
}
}