10.2.4 路由

基于某些路由标准的路由器允许在集成流中进行分支,将消息定向到不同的通道(如图 10.5)。

图 10.5 基于应用于路由器的一些标准,路由器将消息直接发送到不同的通道信息。

例如,假设有一个名为 numberChannel 的通道,整数值通过它流动。假设希望将所有偶数消息定向到一个名为 evenChannel 的通道,而将奇数消息定向到一个名为 oddChannel 的通道。要在集成流中创建这样的路由,可以声明一个 AbstractMessageRouter 类型的 bean,并使用 @Router 注解该 bean:

@Bean
@Router(inputChannel="numberChannel")
public AbstractMessageRouter evenOddRouter() {
 return new AbstractMessageRouter() {
 @Override
 protected Collection<MessageChannel>
 determineTargetChannels(Message<?> message) {
 Integer number = (Integer) message.getPayload();
 if (number % 2 == 0) {
 return Collections.singleton(evenChannel());
 }
 return Collections.singleton(oddChannel());
 }
 };
}
@Bean
public MessageChannel evenChannel() {
 return new DirectChannel();
}
@Bean
public MessageChannel oddChannel() {
 return new DirectChannel();
}

AbstractMessageRouter bean 从 numberChannel 通道接收消息。匿名内部类检查消息负载,如果是偶数,则返回名为 evenChannel 的通道(在路由器 bean 之后定义)。否则,消息负载中的数字为奇数,此时,将返回名为 oddChannel 的通道(也在 bean 声明方法中定义)。

在 Java DSL 形式中,路由器是通过在流定义过程中调用 route() 来声明的,如下所示:

@Bean
public IntegrationFlow numberRoutingFlow(AtomicInteger source) {
 return IntegrationFlows
 ...
 .<Integer, String>route(n -> n%2==0 ? "EVEN":"ODD", mapping -> mapping
 .subFlowMapping("EVEN", sf -> sf
 .<Integer, Integer>transform(n -> n * 10)
 .handle((i,h) -> { ... })
 )
 .subFlowMapping("ODD", sf -> sf
 .transform(RomanNumbers::toRoman)
 .handle((i,h) -> { ... })
 )
 )
 .get();
}

虽然仍然可以声明 AbstractMessageRouter 并将其传递给 route(),但是本例使用 lambda 表达式来确定消息有效负载是奇数还是偶数。如果是偶数,则返回一个偶数的字符串值。如果是奇数,则返回奇数。然后使用这些值来确定哪个子映射将处理消息。

results matching ""

    No results matching ""