8.7. 路由 Slip

概述

路由 slip 模式显示在 图 8.8 “路由 Slip Pattern” 中,您可以连续地通过一系列处理步骤(在设计时不了解步骤序列),每个消息都会不同。消息通过的端点列表存储在标题字段中( slip),Apache Camel 在运行时读取,以即时构建管道。

图 8.8. 路由 Slip Pattern

路由 slip

slip 标头

路由 slip 出现在用户定义的标头中,其中标头值是以逗号分隔的端点 URI 列表。例如,一个路由 slip 指定一系列安全任务,它指定一系列安全任务在验证、验证和取消重复重复出现一个消息的开始,如下所示:

cxf:bean:decrypt,cxf:bean:authenticate,cxf:bean:dedup

当前端点属性

从 Camel 2.5 开始,路由 Slip 将在交换上设置一个属性(Exchange.SLIP_ENDPOINT),该交换中包含当前端点(尽管 slip 一样)。这可让您了解通过 slip 的交换过程。

第 8.7 节 “路由 Slip” 将计算 滑动,即 slip 只是计算一次。如果您需要计算滑动 ,请使用 第 8.18 节 “动态路由器” 模式。

Java DSL 示例

以下路由从 direct:a 端点获取信息,并从 aRoutingSlipHeader 标头中读取路由 slip:

from("direct:b").routingSlip("aRoutingSlipHeader");

您可以将标头名称指定为字符串文字,也可以指定为表达式。

您还可以使用 route Slip () 的双参数形式自定义 URI 分隔符。以下示例定义了路由 slip 的 aRoutingSlipHeader 标头键的路由,并使用 # 字符作为 URI 分隔符:

from("direct:c").routingSlip("aRoutingSlipHeader", "#");

XML 配置示例

以下示例演示了如何在 XML 中配置相同的路由:

<camelContext id="buildRoutingSlip" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:c"/>
    <routingSlip uriDelimiter="#">
      <headerName>aRoutingSlipHeader</headerName>
    </routingSlip>
  </route>
</camelContext>

忽略无效端点

第 8.7 节 “路由 Slip” 现在支持 忽略InvalidEndpoints,它支持 第 8.3 节 “接收者列表” 模式。您可以使用它跳过无效端点。例如:

    from("direct:a").routingSlip("myHeader").ignoreInvalidEndpoints();

在 Spring XML 中,通过在 < routingSlip> 标签上设置 ignoreInvalidEndpoints 属性来 启用这个功能:

   <route>
       <from uri="direct:a"/>
       <routingSlip ignoreInvalidEndpoints="true">
         <headerName>myHeader</headerName>
       </routingSlip>
   </route>

考虑 myHeader 包含两个端点( direct:foo,xxx:bar )的大小写。第一个端点有效并可工作。第二个操作无效,因此忽略。每当遇到无效的端点时,会位于 INFO 级别的 Apache Camel 日志。

选项

routeSlip DSL 命令支持以下选项:

Name

默认值

描述

uriDelimiter

,

表达式返回多个端点时使用的分隔符。

ignoreInvalidEndpoints

false

如果端点 uri 无法解析,它应该被忽略。否则 Camel 将抛出异常,说明端点 uri 无效。

cacheSize

0

Camel 2.13.1/2.12.4: 允许配置 ProducerCache 的缓存大小,缓存生产者以便在路由 slip 中重复使用。默认将使用默认缓存大小 0。将值设为 -1 允许将缓存完全关闭。