此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

在 Spring Integration 2.0 中,我们添加了 Groovy 支持,允许您使用 Groovy 脚本语言为各种集成组件提供逻辑,类似于支持 Spring Expression Language (SpEL) 进行路由、转换和其他集成问题的方式。 有关 Groovy 的详细信息,请参阅 Groovy 文档,您可以在项目网站上找到该文档。Spring中文文档

您需要将此依赖项包含在项目中:Spring中文文档

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

此外,从 V6.0 开始,还提供了用于集成流配置的 Groovy DSLSpring中文文档

Groovy 配置

在 Spring Integration 2.1 中,Groovy 支持的配置命名空间是 Spring Integration 脚本支持的扩展,并共享脚本支持部分中详细描述的核心配置和行为。 尽管 Groovy 脚本得到了通用脚本支持的良好支持,但 Groovy 支持提供了由 Spring 框架和相关组件支持的配置命名空间,为使用 Groovy 提供了扩展功能。 以下列表显示了两个示例配置:Groovyorg.springframework.scripting.groovy.GroovyScriptFactorySpring中文文档

滤波器
<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 命名空间,如命名空间前缀所示。 另请注意,标记上的属性在此命名空间中无效。int-groovylang<script>Spring中文文档

Groovy 对象定制

如果您需要自定义 Groovy 对象本身(除了设置变量之外),您可以引用使用该属性实现的 Bean。 例如,如果要通过修改脚本中可用的函数和注册函数来实现特定于域的语言 (DSL),这可能很有用。 以下示例演示如何执行此操作:GroovyObjectCustomizercustomizerMetaClassSpring中文文档

<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<variable>script-variable-generatorSpring中文文档

Spring Integration 3.0 引入了该属性,该属性与元素结合使用。 此外,如果未提供绑定变量的名称,groovy 脚本还能够将变量解析为 bean 中的 bean。 以下示例演示如何使用变量 ():variablesvariableBeanFactoryentityManagerSpring中文文档

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

entityManager必须是应用程序上下文中的适当 Bean。Spring中文文档

有关元素、属性和属性的更多信息,请参见脚本变量绑定<variable>variablesscript-variable-generatorSpring中文文档

Groovy 脚本编译器定制

提示是最受欢迎的 Groovy 编译器自定义选项。 它可以在类或方法级别使用。 有关详细信息,请参阅 Groovy 参考手册,特别是 @CompileStatic。 为了将此功能用于短脚本(在集成场景中),我们被迫将简单的脚本更改为更像 Java 的代码。 请考虑以下脚本:@CompileStatic<filter>Spring中文文档

headers.type == 'good'

前面的脚本在 Spring Integration 中变为以下方法:Spring中文文档

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

filter(headers)

这样,该方法被转换并编译为静态 Java 代码,绕过 Groovy 调用的动态阶段,例如工厂和代理。filter()getProperty()CallSiteSpring中文文档

从版本 4.3 开始,您可以使用以下选项配置 Spring Integration Groovy 组件,指定应将 for 添加到内部 . 有了这些,您可以在我们的脚本代码中省略方法声明,仍然可以获得编译的纯 Java 代码。 在这种情况下,前面的脚本可以很短,但仍需要比解释的脚本更详细一些,如以下示例所示:compile-staticbooleanASTTransformationCustomizer@CompileStaticCompilerConfiguration@CompileStaticSpring中文文档

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

您必须通过属性访问 and(或任何其他)变量,因为 with 我们没有动态功能。headerspayloadgroovy.lang.Scriptbinding@CompileStaticGroovyObject.getProperty()Spring中文文档

此外,我们还引入了 Bean 引用。 使用此属性,您可以提供任何其他必需的 Groovy 编译器自定义项,例如 . 有关此功能的详细信息,请参阅 Groovy 文档以获取高级编译器配置compiler-configurationImportCustomizerSpring中文文档

使用不会自动为注释添加一个,它会覆盖该选项。 如果你仍然需要 ,你应该手动将 a 添加到该自定义 中。compilerConfigurationASTTransformationCustomizer@CompileStaticcompileStaticCompileStaticnew ASTTransformationCustomizer(CompileStatic.class)CompilationCustomizerscompilerConfiguration
Groovy 编译器自定义对选项没有任何影响,并且可重新加载的脚本也可以静态编译。refresh-check-delay
使用不会自动为注释添加一个,它会覆盖该选项。 如果你仍然需要 ,你应该手动将 a 添加到该自定义 中。compilerConfigurationASTTransformationCustomizer@CompileStaticcompileStaticCompileStaticnew ASTTransformationCustomizer(CompileStatic.class)CompilationCustomizerscompilerConfiguration
Groovy 编译器自定义对选项没有任何影响,并且可重新加载的脚本也可以静态编译。refresh-check-delay

控制总线

如 (Enterprise Integration Patterns) 中所述,控制总线背后的思想是,您可以使用与“应用程序级”消息传递相同的消息传递系统来监视和管理框架中的组件。 在 Spring Integration 中,我们基于前面描述的适配器进行构建,以便您可以发送消息作为调用公开操作的一种方式。 这些操作的一个选项是 Groovy 脚本。 以下示例为控制总线配置 Groovy 脚本:Spring中文文档

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

控制总线具有一个输入通道,可以访问该通道以调用应用程序上下文中对 Bean 的操作。Spring中文文档

Groovy 控制总线将消息作为 Groovy 脚本在输入通道上运行。 它接受一条消息,将正文编译为脚本,使用 自定义它,然后运行它。 控制总线在应用程序上下文中公开所有用 Spring 接口注释并实现 Spring 的基类或扩展 Spring 基类的 bean(例如,几个 and 实现)。GroovyObjectCustomizerMessageProcessor@ManagedResourceLifecycleCustomizableThreadCreatorTaskExecutorTaskSchedulerSpring中文文档

在控制总线命令脚本中使用具有自定义作用域(例如“request”)的托管 Bean 时要小心,尤其是在异步消息流中。 如果控制总线无法从应用程序上下文中公开 bean,则在命令脚本运行期间最终可能会得到一些 bean。 例如,如果未建立自定义作用域的上下文,则尝试获取该作用域内的 Bean 会触发 .MessageProcessorBeansExceptionBeanCreationException

如果需要进一步自定义 Groovy 对象,还可以提供对通过该属性实现的 Bean 的引用,如以下示例所示:GroovyObjectCustomizercustomizerSpring中文文档

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

<beans:bean id="groovyCustomizer" class="org.foo.MyGroovyObjectCustomizer"/>
在控制总线命令脚本中使用具有自定义作用域(例如“request”)的托管 Bean 时要小心,尤其是在异步消息流中。 如果控制总线无法从应用程序上下文中公开 bean,则在命令脚本运行期间最终可能会得到一些 bean。 例如,如果未建立自定义作用域的上下文,则尝试获取该作用域内的 Bean 会触发 .MessageProcessorBeansExceptionBeanCreationException