常用路由参数
本节描述了所有路由器参数的通用参数(即本章前面两个表格中所有方框均已勾选的参数)。
链内与链外
以下参数对所有链内和链外的路由器均有效。
apply-sequence
该属性指定是否应为每条消息添加序列号和大小头部。此可选属性默认为 false。
default-output-channel
如果设置了此属性,它提供了一个引用,指向当通道解析未能返回任何通道时应发送消息的通道。如果未提供默认输出通道,路由器将抛出异常。如果您希望静默丢弃这些消息,请将默认输出通道属性值设置为 nullChannel。
从版本 6.0 开始,设置默认输出通道也会将 channelKeyFallback 选项重置为 false。因此,系统将不再尝试根据通道名称解析通道,而是回退到此默认输出通道——类似于 Java 的 switch 语句。如果显式将 channelKeyFallback 设置为 true,进一步的逻辑将取决于 resolutionRequired 选项:只有当 resolutionRequired 为 false 时,来自键的非解析通道的消息才能到达 defaultOutputChannel。因此,在 AbstractMappingMessageRouter 初始化阶段会拒绝提供 defaultOutputChannel 且同时将 channelKeyFallback 和 resolutionRequired 都设置为 true 的配置。
resolution-required
此属性指定是否必须始终成功将通道名称解析为存在的通道实例。如果设置为 true,当通道无法解析时会引发 MessagingException。将此属性设置为 false 会导致任何无法解析的通道被忽略。此可选属性默认值为 true。
当 resolution-required 为 false 且通道未解析时,消息仅发送到指定的 default-output-channel。
ignore-send-failures
如果设置为 true,则忽略向消息通道发送失败的情况。如果设置为 false,则会抛出 MessageDeliveryException 异常,并且如果路由器解析出多个通道,则后续任何通道都不会接收到该消息。
此属性的确切行为取决于消息发送到的Channel类型。例如,在使用直接通道(单线程)时,发送失败可能是由更下游组件抛出的异常引起的。然而,当向简单队列通道(异步)发送消息时,抛出异常的可能性则相当低。
虽然大多数路由器只路由到单个通道,但它们也可以返回多个通道名称。例如,recipient-list-router 正是这样做的。如果在仅路由到单个通道的路由器上将此属性设置为 true,任何引发的异常都会被忽略,这通常没有意义。在这种情况下,更好的做法是在流程入口点的错误流中捕获异常。因此,当路由器实现返回多个通道名称时,将 ignore-send-failures 属性设置为 true 通常更有意义,因为失败通道之后的其他通道仍将接收消息。
此属性默认为 false。
timeout
timeout 属性指定了向目标消息通道发送消息时等待的最长时间(以毫秒为单位)。
顶层(链外)
以下参数仅对链外所有顶级路由器有效。
id
标识底层的Spring bean定义,对于路由器而言,该定义是EventDrivenConsumer或PollingConsumer的实例,具体取决于路由器的input-channel分别是SubscribableChannel还是PollableChannel。这是一个可选属性。
auto-startup
“lifecycle”属性指示该组件是否应在应用程序上下文启动期间启动。此可选属性默认值为 true。
input-channel
此端点的接收消息通道。
order
此属性定义了当此端点作为订阅者连接到通道时的调用顺序。这在通道使用故障转移调度策略时尤为重要。当此端点本身是带有队列的通道的轮询消费者时,此属性无效。