跳到主要内容

Groovy DSL

QWen Plus 中英对照 Groovy DSL

Groovy DSL 是 Java DSL 的包装和扩展。我们在这里的主要目标是使 Groovy 上的 Spring Integration 开发尽可能平滑和直接,并且与现有的 Java DSL 兼容,同时包含一些 Groovy 扩展或特定于语言的结构。该实现是 Groovy 支持 模块的一部分。

你只需要 import static org.springframework.integration.groovy.dsl.IntegrationGroovyDsl.integrationFlow 这样一个导入语句即可开始 - 一个包含 Groovy DSL 工厂方法重载的类。

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

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

在这种情况下,Groovy 理解这个闭包应该被翻译成一个 IntegrationFlow 匿名实例,并且目标 Java DSL 处理器会将此构造正确解析为 Java 对象。

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

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

这样的全局 integrationFlow() 函数期望以构建器风格的闭包作为 GroovyIntegrationFlowDefinitionIntegrationFlowDefinition 的 Groovy 包装)并产生一个常规的 IntegrationFlow lambda 实现。请参阅下面更多的重载 integrationFlow() 变体。

许多其他场景需要从数据源启动一个 IntegrationFlow(例如 JdbcPollingChannelAdapterJmsInboundGateway 或只是一个现有的 MessageChannel)。为此,Spring Integration Java DSL 提供了一个带有多个重载 from() 方法的 IntegrationFlow 工厂。此工厂也可以在 groovy 中使用:

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

但遗憾的是,并不是所有的 from() 方法都与 Groovy 结构兼容。为了解决这个问题,Spring Integration 提供了一个围绕 IntegrationFlow 工厂的 Groovy DSL 工厂。它实现为一组重载的 integrationFlow() 函数。通过一个 GroovyIntegrationFlowDefinition 的消费者来声明剩余的流程作为 IntegrationFlow 闭包,以重用上述的经验,同时也避免了在最后需要一个 get() 调用。例如:

@Bean
functionFlow() {
integrationFlow Function<byte[], String>,
{ beanName 'functionGateway' },
{
transform {
transformer Transformers.objectToString()
id 'objectToStringTransformer'
}
transform {
transformer { it.toUpperCase() }
expectedType String
}
splitWith {
expectedType Message<?>
function { it.payload }
}
splitWith {
expectedType Object
id 'splitterEndpoint'
function { it }
}
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' }
}
}
groovy