对于最新的稳定版本,请使用 Spring Integration 6.4.0! |
Groovy DSL
Groovy DSL 是 Java DSL 的包装器和扩展。 我们在这里追求的主要目标是通过与现有 Java DSL 和一些 Groovy 扩展或特定于语言的结构的互操作性,使 Groovy 上的 Spring 集成开发尽可能顺利和直接。 该实现是 Groovy Support 模块的一部分。
你只需要一个 import for 开始 - 一个包含 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 {
messageGroupId 'delayGroup'
defaultDelay 100
}
transform {
transformer { it.toUpperCase() }
expectedType String
}
}
}
这样的全局函数需要 a 的 builder 样式的闭包(a 的 Groovy 包装器),并生成常规的 lambda 实现。
请参阅下面的更多重载变体。integrationFlow()
GroovyIntegrationFlowDefinition
IntegrationFlowDefinition
IntegrationFlow
integrationFlow()
许多其他场景需要从数据源开始(例如 ,或只是现有的 )。
为此, Spring 集成 Java DSL 提供了一个具有许多重载方法的工厂。
这个工厂也可以用在 groovy 中: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 集成围绕工厂提供了一个 Groovy DSL 工厂。
它作为一组重载函数实现。
使用使用者论坛将流的其余部分声明为闭包,以重用上述体验,并且避免了最后调用的需要。
例如:from()
IntegrationFlow
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' }
}
}