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