对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

该包包含前面提到的 API 和许多实现,这些实现也是构建器,并提供 Fluent API 来配置具体端点。 基础架构为基于消息的应用程序(如通道、端点、轮询器和通道拦截器)提供通用的企业集成模式 (EIP)。org.springframework.integration.dslIntegrationFlowBuilderIntegrationComponentSpecIntegrationFlowBuilderSpring中文文档

重要

是一个实现,因此不能从 Bean 定义中调用它的方法。 对于 Bean 定义,实现必须保持原样,框架将管理其生命周期。 目标类型(值)的 Bean 方法参数注入必须用于 Bean 定义,而不是 Bean 方法引用。IntegrationComponentSpecFactoryBeangetObject()IntegrationComponentSpecIntegrationComponentSpecFactoryBeanIntegrationFlowSpring中文文档

端点在 DSL 中表示为谓词,以提高可读性。 以下列表包括通用 DSL 方法名称和关联的 EIP 终端节点:Spring中文文档

从概念上讲,集成过程是通过将这些端点组合到一个或多个消息流中来构造的。 请注意,EIP 没有正式定义术语“消息流”,但将其视为使用众所周知的消息传递模式的工作单元很有用。 DSL 提供了一个组件来定义通道和它们之间的端点的组成,但现在只扮演配置角色以在应用程序上下文中填充真正的 Bean,并且在运行时不使用。 但是,bean for 可以自动连接为控制和整个流,该流被委托给与此相关的所有 Spring Integration 组件。 以下示例使用 fluent API 通过 EIP-methods 定义 Bean:IntegrationFlowIntegrationFlowIntegrationFlowLifecyclestart()stop()IntegrationFlowIntegrationFlowIntegrationFlowIntegrationFlowBuilderSpring中文文档

@Bean
public IntegrationFlow integerFlow() {
    return IntegrationFlow.from("input")
            .<String, Integer>transform(Integer::parseInt)
            .get();
}

该方法接受 lambda 作为终端节点参数,以对消息负载进行操作。 此方法的真正参数是一个实例。 因此,任何提供的变压器(、 和其他)都可以在这里使用。transformGenericTransformer<S, T>ObjectToJsonTransformerFileToStringTransformerSpring中文文档

在后盖下,分别用 和 识别它的端点。 请看另一个例子:IntegrationFlowBuilderMessageHandlerMessageTransformingHandlerConsumerEndpointFactoryBeanSpring中文文档

@Bean
public IntegrationFlow myFlow() {
    return IntegrationFlow.from("input")
                .filter("World"::equals)
                .transform("Hello "::concat)
                .handle(System.out::println)
                .get();
}

前面的示例组成了 的序列。 流程是“单向”。 也就是说,它不提供回复消息,而只是将有效负载打印到 STDOUT。 使用直接通道自动将端点连接在一起。Filter → Transformer → Service ActivatorSpring中文文档

Lambda 和参数Message<?>

在 EIP 方法中使用 lambda 时,“input”参数通常是消息负载。 如果要访问整个消息,请使用将 a 作为第一个参数的重载方法之一。 例如,这不起作用:Class<?>Spring中文文档

.<Message<?>, Foo>transform(m -> newFooFromMessage(m))

这将在运行时失败,因为 lambda 不保留参数类型,并且框架将尝试将有效负载强制转换为 .ClassCastExceptionMessage<?>Spring中文文档

请改用:Spring中文文档

.(Message.class, m -> newFooFromMessage(m))
Lambda 和参数Message<?>

在 EIP 方法中使用 lambda 时,“input”参数通常是消息负载。 如果要访问整个消息,请使用将 a 作为第一个参数的重载方法之一。 例如,这不起作用:Class<?>Spring中文文档

.<Message<?>, Foo>transform(m -> newFooFromMessage(m))

这将在运行时失败,因为 lambda 不保留参数类型,并且框架将尝试将有效负载强制转换为 .ClassCastExceptionMessage<?>Spring中文文档

请改用:Spring中文文档

.(Message.class, m -> newFooFromMessage(m))
Bean 定义覆盖

Java DSL 可以为流定义中内联定义的对象注册 Bean,也可以重用现有的注入 Bean。 如果为内联对象定义的 Bean 名称与现有 Bean 定义相同,则会抛出 a 表示此类配置错误。 但是,当您处理 Bean 时,无法从集成流处理器中检测现有的 Bean 定义,因为每次我们从 Bean 调用 Bean 时,我们都会得到一个新实例。 这样,提供的实例就可以按原样使用,而无需任何 Bean 注册和对现有 Bean 定义进行任何可能的检查。 但是,如果该对象具有显式且此名称的 Bean 定义在范围内,则会为此对象调用该对象。BeanDefinitionOverrideExceptionprototypeprototypeBeanFactoryIntegrationFlowprototypeBeanFactory.initializeBean()idprototypeSpring中文文档

Bean 定义覆盖

Java DSL 可以为流定义中内联定义的对象注册 Bean,也可以重用现有的注入 Bean。 如果为内联对象定义的 Bean 名称与现有 Bean 定义相同,则会抛出 a 表示此类配置错误。 但是,当您处理 Bean 时,无法从集成流处理器中检测现有的 Bean 定义,因为每次我们从 Bean 调用 Bean 时,我们都会得到一个新实例。 这样,提供的实例就可以按原样使用,而无需任何 Bean 注册和对现有 Bean 定义进行任何可能的检查。 但是,如果该对象具有显式且此名称的 Bean 定义在范围内,则会为此对象调用该对象。BeanDefinitionOverrideExceptionprototypeprototypeBeanFactoryIntegrationFlowprototypeBeanFactory.initializeBean()idprototypeSpring中文文档