8.7. 路由 Slip
概述
路由 slip 模式(如 图 8.8 “路由 Slip Pattern” 所示)可让您连续通过一系列处理步骤路由消息,在设计时不已知这些步骤序列,并可能因每条消息而异。消息应传递的端点列表存储在标头字段中( slip),Apache Camel 会在运行时读取以即时构建管道。
图 8.8. 路由 Slip Pattern
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 on-the-f,则使用 第 8.18 节 “动态路由器” 模式。
Java DSL 示例
以下路由从 direct:a
端点获取信息,并从 aRoutingSlipHeader
标头中读取路由 slip:
from("direct:b").routingSlip("aRoutingSlipHeader");
您可以将标头名称指定为字符串文字或表达式。
您也可以使用 routingSlip()
的双参数形式自定义 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
。第一个端点有效且可以正常工作。第二个是无效,因此忽略。当遇到无效的端点时,Apache Camel 都会在 INFO
级别记录。
选项
routingSlip
DSL 命令支持以下选项:
名称 | 默认值 | 描述 |
|
| 表达式返回的多个端点时使用分隔符。 |
|
| 如果无法解析 endpoint uri,它应该被忽略。否则,Camel 会抛出一个异常,说明 endpoint uri 无效。 |
|
| Camel 2.13.1/2.12.4: 允许配置 ProducerCache 的缓存大小,该缓存制作者在路由 slip 中重复使用。默认情况下,将使用默认的缓存大小,即 0。将值设为 -1 允许将缓存全部关闭。 |