配置通用路由器
Spring 集成提供了一个通用路由器。 你可以将它用于通用路由(与 Spring Integration 提供的其他路由器相反,每个路由器都有某种形式的专用化)。
以下部分介绍了具有 XML 组件的路由器配置。
该元素提供了一种将 router 连接到 input 通道的方法,并且还接受 optional 属性。
该属性引用自定义路由器实现的 bean 名称(必须扩展)。
以下示例显示了三个通用路由器:router
default-output-channel
ref
AbstractMessageRouter
<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"/>
或者,可以指向包含 Comments 的 POJO(稍后显示),或者你可以将 与显式方法名称组合在一起。
指定方法将应用本文档后面的 annotation 部分中描述的相同行为。
下面的示例定义了一个在其属性中指向 POJO 的路由器:ref
@Router
ref
@Router
ref
<int:router input-channel="input" ref="somePojo" method="someMethod"/>
如果自定义路由器实现在其他定义中引用,我们通常建议使用属性。
但是,如果自定义路由器实现的范围应限定为单个定义的定义,则可以提供内部 Bean 定义,如下例所示:ref
<router>
<router>
<int:router method="someMethod" input-channel="input3"
default-output-channel="defaultOutput3">
<beans:bean class="org.foo.MyCustomRouter"/>
</int:router>
不允许在同一配置中同时使用 attribute 和 inner handler definition。
这样做会产生不明确的条件并引发异常。ref <router> |
如果该属性引用了扩展的 Bean(例如框架本身提供的路由器),则配置将优化为直接引用路由器。
在这种情况下,每个属性必须引用单独的 bean 实例(或范围的 bean)或使用内部配置类型。
但是,仅当未在路由器 XML 定义中提供任何特定于路由器的属性时,此优化才适用。
如果您无意中从多个 bean 引用了相同的消息处理程序,则会收到配置异常。ref AbstractMessageProducingHandler ref prototype <bean/> |
以下示例显示了在 Java 中配置的等效路由器:
@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 配置的等效路由器:
@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
}
};
}
或者,您可以路由来自消息负载的数据,如下例所示:
@Bean
public IntegrationFlow routerFlow() {
return IntegrationFlow.from("routingChannel")
.route(String.class, p -> p.contains("foo") ? "fooChannel" : "barChannel")
.get();
}