路由器
本节介绍路由器的工作原理。它包括以下主题:
部分总结
概述
路由器是许多消息架构中的关键元素。它们从消息通道消费消息,并根据一组条件将每个消费的消息转发到一个或多个不同的消息通道。
常见的路由器参数
本节描述了所有路由器参数共有的参数(即在本章前面显示的两个表格中所有框都打勾的参数)。
路由器实现
由于基于内容的路由通常需要一些特定领域的逻辑,大多数用例需要 Spring Integration 提供的委托给 POJO 的选项,这可以通过使用 XML 命名空间支持或注解来实现。这两种方法将在后面讨论。然而,我们首先介绍几种满足常见需求的实现。
配置通用路由器
Spring Integration 提供了一个通用路由器。您可以将其用于通用路由(与其他由 Spring Integration 提供的路由器不同,每个路由器都有某种形式的 specialization)。
路由器和 Spring 表达式语言 (SpEL)
有时,路由逻辑可能很简单,为它编写一个单独的类并将其配置为bean似乎显得过于复杂。自 Spring Integration 2.0 起,我们提供了一种替代方案,允许您使用 SpEL 来实现以前需要自定义 POJO 路由器的简单计算。
配置带有注解的路由器
当使用 @Router 注解一个方法时,该方法可以返回 MessageChannel 或 String 类型。在后一种情况下,端点解析通道名称的方式与默认输出通道相同。此外,该方法可以返回单个值或集合。如果返回的是集合,则回复消息将发送到多个通道。总之,以下方法签名都是有效的:
动态路由器
Spring Integration 提供了相当多不同的路由器配置,适用于常见的基于内容的路由用例,同时也提供了将自定义路由器作为 POJO 实现的选项。例如,PayloadTypeRouter 提供了一种简单的方式来配置路由器,该路由器根据传入消息的有效负载类型计算通道,而 HeaderValueRouter 在通过评估特定消息头的值来配置计算通道的路由器时提供了同样的便利。还有基于表达式(SpEL)的路由器,在这些路由器中,通道是根据评估表达式的结果确定的。所有这些类型的路由器都表现出一些动态特性。
路由单据
从 4.1 版本开始,Spring Integration 提供了路由单企业集成模式的实现。它是作为 routingSlip 消息头实现的,用于在未为端点指定输出通道时,确定 AbstractMessageProducingHandler 实例中的下一个通道。当消息到达没有输出通道的端点时,会查询路由单以确定消息发送到的下一个通道。当路由单用尽时,正常的 replyChannel 处理将继续。此模式在复杂、动态的情况下非常有用,此时配置多个路由器来确定消息流可能会变得困难。
进程管理器企业集成模式
企业集成模式包括流程管理器模式。现在,您可以使用封装在 RoutingSlipRouteStrategy 中的自定义流程管理器逻辑轻松实现此模式。除了 bean 名称之外,RoutingSlipRouteStrategy 可以返回任何 MessageChannel 对象,并且不要求这个 MessageChannel 实例必须是应用程序上下文中的 bean。这样,当无法预测应使用哪个通道时,我们可以提供强大的动态路由逻辑。可以在 RoutingSlipRouteStrategy 内创建并返回一个 MessageChannel。带有相关 MessageHandler 实现的 FixedSubscriberChannel 是这种情况下的一种很好的组合。例如,您可以路由到响应式流,如下例所示: