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

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

Spring Integration 提供了一个通用路由器。 您可以将其用于通用路由(与Spring Integration提供的其他路由器相反,每个路由器都有某种形式的专用化)。Spring中文文档

以下部分介绍了具有 XML 组件的路由器配置。Spring中文文档

该元素提供了一种将路由器连接到输入通道的方法,并且还接受可选属性。 该属性引用自定义路由器实现的 Bean 名称(必须扩展)。 以下示例显示了三个通用路由器:routerdefault-output-channelrefAbstractMessageRouterSpring中文文档

<int:router ref="payloadTypeRouter" input-channel="input1"
            default-output-channel="defaultOutput1"/>

<int:router ref="recipientListRouter" input-channel="input2"
            default-output-channel="defaultOutput2"/>

<int:router ref="customRouter" input-channel="input3"
            default-output-channel="defaultOutput3"/>

<beans:bean id="customRouterBean" class="org.foo.MyCustomRouter"/>

或者,可以指向包含注释的 POJO(稍后显示),也可以将 与显式方法名称结合使用。 指定方法将应用本文档后面的注释部分中描述的相同行为。 以下示例定义一个路由器,该路由器在其属性中指向 POJO:ref@Routerref@RouterrefSpring中文文档

<int:router input-channel="input" ref="somePojo" method="someMethod"/>

如果自定义路由器实现在其他定义中引用,我们通常建议使用属性。 但是,如果自定义路由器实现的范围应限定为 的单个定义,则可以提供内 Bean 定义,如以下示例所示:ref<router><router>Spring中文文档

<int:router method="someMethod" input-channel="input3"
            default-output-channel="defaultOutput3">
    <beans:bean class="org.foo.MyCustomRouter"/>
</int:router>
不允许在同一配置中同时使用属性和内部处理程序定义。 这样做会创建一个模棱两可的条件并引发异常。ref<router>
不允许在同一配置中同时使用属性和内部处理程序定义。 这样做会创建一个模棱两可的条件并引发异常。ref<router>
如果该属性引用了扩展的 Bean(例如框架本身提供的路由器),则配置将优化为直接引用路由器。 在这种情况下,每个属性都必须引用一个单独的 Bean 实例(或 -scoped bean)或使用内部配置类型。 但是,仅当未在路由器 XML 定义中提供任何特定于路由器的属性时,此优化才适用。 如果无意中引用了多个 Bean 中的同一消息处理程序,则会出现配置异常。refAbstractMessageProducingHandlerrefprototype<bean/>
如果该属性引用了扩展的 Bean(例如框架本身提供的路由器),则配置将优化为直接引用路由器。 在这种情况下,每个属性都必须引用一个单独的 Bean 实例(或 -scoped bean)或使用内部配置类型。 但是,仅当未在路由器 XML 定义中提供任何特定于路由器的属性时,此优化才适用。 如果无意中引用了多个 Bean 中的同一消息处理程序,则会出现配置异常。refAbstractMessageProducingHandlerrefprototype<bean/>

以下示例显示了在 Java 中配置的等效路由器:Spring中文文档

@Bean
@Router(inputChannel = "routingChannel")
public AbstractMessageRouter myCustomRouter() {
    return new AbstractMessageRouter() {

        @Override
        protected Collection<MessageChannel> determineTargetChannels(Message<?> message) {
            return // determine channel(s) for message
        }

    };
}

以下示例显示了使用 Java DSL 配置的等效路由器:Spring中文文档

@Bean
public IntegrationFlow routerFlow() {
    return IntegrationFlow.from("routingChannel")
            .route(myCustomRouter())
            .get();
}

public AbstractMessageRouter myCustomRouter() {
    return new AbstractMessageRouter() {

        @Override
        protected Collection<MessageChannel> determineTargetChannels(Message<?> message) {
            return // determine channel(s) for message
        }

    };
}

或者,您可以路由来自消息有效负载的数据,如以下示例所示:Spring中文文档

@Bean
public IntegrationFlow routerFlow() {
    return IntegrationFlow.from("routingChannel")
            .route(String.class, p -> p.contains("foo") ? "fooChannel" : "barChannel")
            .get();
}