对于最新稳定版本,请使用 Spring Integration 7.0.0spring-doc.cadn.net.cn

DSL 基础知识

org.springframework.integration.dsl包包含IntegrationFlowBuilder前面提到的API,以及一些IntegrationComponentSpec实现,同时也是构建者,并提供流畅的API来配置具体端点。 这IntegrationFlowBuilder基础设施为基于消息的应用(如通道、端点、轮询器和通道拦截器)提供了通用的企业集成模式(EIP)。spring-doc.cadn.net.cn

重要

IntegrationComponentSpec工厂豆实现,因此其getObject()方法不得从豆定义中调用。 这IntegrationComponentSpecBEAN定义的实现必须保持原样,框架将管理其生命周期。 Bean方法对目标的参数注入IntegrationComponentSpec类型(a工厂豆值)必须用于集成流程用豆子定义代替豆子方法引用。spring-doc.cadn.net.cn

端点在DSL中以动词表示以提高可读性。 以下列表包括常见的DSL方法名称及相关的EIP端点:spring-doc.cadn.net.cn

从概念上讲,集成过程是通过将这些端点组合成一个或多个消息流来构建的。 注意,EIP并未正式定义“消息流”一词,但将其视为使用已知消息模式的工作单元是有用的。 DSL提供了集成流程组件 来定义通道及其间端点的组合,但现在集成流程仅在应用上下文中扮演配置角色,填充真实豆子,运行时不使用。 然而,豆子的集成流程可以自动接线为生命周期控制开始()停止()对整个流程,该流程委托给所有与此关联的春季集成组件集成流程. 以下示例使用了集成流程流畅API用于定义集成流程通过使用 EIP 方法进行豆子IntegrationFlowBuilder:spring-doc.cadn.net.cn

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

变换方法接受 lambda 作为端点参数来作消息有效载荷。 该方法的实参数为通用变换器变换器<S,T型变换器>实例。 因此,任何提供的变换器(ObjectToJsonTransformer,FileToStringTransformer, 以及其他)可以在这里使用。spring-doc.cadn.net.cn

被窝里,IntegrationFlowBuilder识别消息处理器以及它的端点,令消息变换处理程序ConsumerEndpointFactoryBean分别。 再举一个例子:spring-doc.cadn.net.cn

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

前述例子由转换器→服务激活器→Filter. 流程是“单向”的。 也就是说,它不提供回复消息,只打印有效载荷到 STDOUT。 端点通过直接通道自动布线。spring-doc.cadn.net.cn

Lambda 和留言<?>参数

在EIP方法中使用λ时,“输入”参数通常是消息有效载荷。 如果你想访问整个消息,可以使用那些过载的方法之一,该方法对班级是<?>作为第一个参数。 例如,以下方法行不通:spring-doc.cadn.net.cn

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

在运行时,当ClassCastException因为 lambda 不保留参数类型,框架会尝试将有效载荷投射到留言<?>.spring-doc.cadn.net.cn

相反,请使用:spring-doc.cadn.net.cn

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

Java DSL 可以注册 Flow 定义中内联定义对象的 beans,并且可以复用已注入的 beans。 如果内联对象定义相同的豆名和现有的豆定义,则BeanDefinitionOverrideException掷出,表明这种配置是错误的。 然而,当你处理原型Beans,无法从积分流处理器检测到已有的BEAN定义,因为每次我们调用原型豆子来自豆子工厂我们会得到一个新的实例。 这样,给定的实例被用于集成流程目前没有任何Beans注册,也没有任何可能的现有核查原型豆子的定义。 然而BeanFactory.initializeBean()如果该对象有显式身份证而该名称的豆氏定义为原型范围。spring-doc.cadn.net.cn