该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 Spring Integration 7.0.0spring-doc.cadn.net.cn

Groovy支持阵容

在 Spring Integration 2.0 中,我们增加了 Groovy 支持,允许你使用 Groovy 脚本语言为各种集成组件提供逻辑——类似于 Spring 表达式语言(SpEL)在路由、转换及其他集成问题上的支持。 欲了解更多关于Groovy的信息,请参阅项目网站上的Groovy文档。spring-doc.cadn.net.cn

你需要把这种依赖性纳入你的项目中:spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-groovy</artifactId>
    <version>6.3.12-SNAPSHOT</version>
</dependency>
compile "org.springframework.integration:spring-integration-groovy:6.3.12-SNAPSHOT"

此外,从6.0版本开始,还提供了用于集成流程配置的Groovy DSLspring-doc.cadn.net.cn

Groovy 配置

在 Spring Integration 2.1 中,Groovy 支持的配置命名空间是 Spring Integration 脚本支持的扩展,共享脚本支持部分详细描述的核心配置和行为。 尽管Groovy脚本得到了通用脚本支持,但Groovy支持还提供槽的配置命名空间,由 Spring 框架的支持org.springframework.scripting.groovy.GroovyScriptFactory以及相关组件,提供Groovy的扩展功能。 以下列表展示了两种示例配置:spring-doc.cadn.net.cn

Filter
<int:filter input-channel="referencedScriptInput">
   <int-groovy:script location="some/path/to/groovy/file/GroovyFilterTests.groovy"/>
</int:filter>

<int:filter input-channel="inlineScriptInput">
     <int-groovy:script><![CDATA[
     return payload == 'good'
   ]]></int-groovy:script>
</int:filter>

如前述示例所示,该配置与一般脚本支持配置完全相同。 唯一的区别是使用 Groovy 命名空间,具体由酷炫命名空间前缀。 还要注意属性<脚本>标签在此命名空间中无效。spring-doc.cadn.net.cn

Groovy 对象定制

如果你需要自定义Groovy对象本身(除了设置变量之外),你可以引用一个实现GroovyObjectCustomizer通过使用定制器属性。 例如,如果你想通过修改元阶级并注册脚本中可用的函数。 以下示例展示了如何实现:spring-doc.cadn.net.cn

<int:service-activator input-channel="groovyChannel">
    <int-groovy:script location="somewhere/SomeScript.groovy" customizer="groovyCustomizer"/>
</int:service-activator>

<beans:bean id="groovyCustomizer" class="org.something.MyGroovyObjectCustomizer"/>

设置自定义GroovyObjectCustomizer与 不互斥<可变的>元素或脚本变量生成器属性。 在定义内联脚本时也可以提供该信息。spring-doc.cadn.net.cn

Spring Integration 3.0 引入了变量属性,该功能与变量元素。 此外,groovy 脚本能够将变量解析为豆子工厂如果没有提供绑定变量的名称,则为 。 以下示例展示了如何使用变量(entityManager):spring-doc.cadn.net.cn

<int-groovy:script>
    <![CDATA[
        entityManager.persist(payload)
        payload
    ]]>
</int-groovy:script>

entityManager必须是应用上下文中的合适豆子。spring-doc.cadn.net.cn

欲了解更多关于<可变的>元素,该变量属性,以及脚本变量生成器属性,参见脚本变量绑定spring-doc.cadn.net.cn

Groovy 脚本编译器定制

@CompileStatic提示是Groovy最受欢迎的编译器定制选项。 它可以在类级或方法层面使用。 更多信息请参见Groovy参考手册,特别是《@CompileStatic》。 为了在集成场景中利用这一功能来处理短脚本,我们不得不将简单的脚本改成更像Java的代码。 请考虑以下内容<Filter>脚本:spring-doc.cadn.net.cn

headers.type == 'good'

前述脚本在春季集成中变为以下方法:spring-doc.cadn.net.cn

@groovy.transform.CompileStatic
String filter(Map headers) {
	headers.type == 'good'
}

filter(headers)

说到这里,filter()方法被转换并编译为静态 Java 代码,绕过了 Groovy 调用的动态阶段,例如getProperty()工厂和CallSite代理。spring-doc.cadn.net.cn

从4.3版本开始,你可以用编译静态 布尔选项,指定ASTTransformationCustomizer@CompileStatic应该加到内部编译器配置. 有了这个条件,你可以省略 Doc 的方法声明@CompileStatic但仍然能得到编译好的纯Java代码。 在这种情况下,前述文字可以很短,但仍需要比解释式文字更冗长一些,如下示例所示:spring-doc.cadn.net.cn

binding.variables.headers.type == 'good'

你必须访问有效载荷(或其他任何)变量通过groovy.lang.Script 捆绑性质,因为,其中@CompileStatic,我们没有GroovyObject.getProperty()能力。spring-doc.cadn.net.cn

此外,我们还引入了编译器配置比恩的引用。 通过该属性,你可以提供其他必要的Groovy编译器定制,例如:ImportCustomizer. 有关此功能的更多信息,请参见 Groovy 文档中的高级编译器配置spring-doc.cadn.net.cn

编译器配置不会自动添加ASTTransformationCustomizer对于@CompileStatic注释,并且覆盖了compile静态选择。 如果你还需要编译静态你应该手动添加一个new ASTTransformationCustomizer(CompileStatic.class)进入合辑定制器该习俗编译器配置.
Groovy 编译器的自定义不会影响刷新-检查-延迟选项脚本和可加载脚本也可以静态编译。

控制总线

如(企业集成模式)中所述,控制总线背后的理念是,你可以使用与“应用级”消息传递相同的消息系统来监控和管理框架内的组件。 在 Spring Integration 中,我们基于之前描述的适配器,使你可以发送消息作为调用暴露作的方式。 这些作的一个选择是Groovy脚本。 以下示例为控制总线配置Groovy脚本:spring-doc.cadn.net.cn

<int-groovy:control-bus input-channel="operationChannel"/>

控制总线有一个输入通道,可以在应用上下文中调用豆子作。spring-doc.cadn.net.cn

Groovy 控制总线在输入通道上以 Groovy 脚本的形式运行消息。 它接收一条消息,将正文编译成脚本,并用GroovyObjectCustomizer,并运行它。 控制总线”消息处理器在应用上下文中,暴露所有注释为@ManagedResource并实现Spring的生命周期接口或扩展 Spring可定制线程编辑器基类(例如,若干任务执行者任务调度器实现)。spring-doc.cadn.net.cn

在Control Bus的命令脚本中使用带有自定义作用域(如“请求”)的管理豆时要小心,尤其是在异步消息流中。 如果消息处理器如果控制总线无法从应用上下文中暴露 BEAN,你可能会得到一些豆子例外在指令脚本运行期间。 例如,如果未建立自定义作用域的上下文,尝试将豆子置于该范围时会触发BeanCreationException.

如果你需要进一步自定义Groovy对象,也可以提供一个实现GroovyObjectCustomizer通过定制器属性,如下例所示:spring-doc.cadn.net.cn

<int-groovy:control-bus input-channel="input"
        output-channel="output"
        customizer="groovyCustomizer"/>

<beans:bean id="groovyCustomizer" class="org.foo.MyGroovyObjectCustomizer"/>