例如,假设有一个名为 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 之后声明为 bean)。否则,通道有效载荷中的数字必须为奇数;在这种情况下,将返回名为 oddChannel 的通道(也在 bean 声明方法中声明)。
@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();
}