Groovy DSL系列

时髦的 DSL

Groovy DSL 是 Java DSL 的包装器和扩展。 我们在这里追求的主要目标是使 Groovy 上的 Spring Integration 开发尽可能顺利和直接,因为它与现有的 Java DSL 和一些 Groovy 扩展或特定于语言的结构具有互作性。 该实现是 Groovy 支持模块的一部分。spring-doc.cadn.net.cn

您只需导入即可开始import static org.springframework.integration.groovy.dsl.IntegrationGroovyDsl.integrationFlow- 一个包含 Groovy DSL 的重载工厂方法的类。spring-doc.cadn.net.cn

IntegrationFlow定义为 lambda,我们通常不需要 Groovy 中的任何其他内容,只需声明一个这样的 bean:spring-doc.cadn.net.cn

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

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

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

@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 包装器IntegrationFlowDefinition) 并产生常规的IntegrationFlowlambda 实现。 查看更多 overloadedintegrationFlow()下面的变体。spring-doc.cadn.net.cn

许多其他方案需要IntegrationFlow从数据源(例如JdbcPollingChannelAdapter,JmsInboundGateway或者只是现有的MessageChannel). 为此,Spring Integration Java DSL 提供了一个IntegrationFlow工厂与多个超载from()方法。 这个工厂也可以用于 groovy:spring-doc.cadn.net.cn

@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关闭以重用上述体验,并避免需要get()最后打电话。 例如:spring-doc.cadn.net.cn

@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' }
            }
}