8.18. 动态路由器
动态路由器 复制链接链接已复制到粘贴板!
动态路由器 模式(如 图 8.12 “动态路由器模式” 所示),可让您通过一系列处理步骤来持续路由消息,其中一系列步骤在设计时不知道。消息应通过的端点列表 在运行时 动态计算。每次消息从端点返回时,动态路由器调用返回 bean,以发现路由中的下一个端点。
图 8.12. 动态路由器模式
在 Camel 2.5 中,我们在 DSL 中引入了一个 dynamicRouter
,它类似于一个动态 第 8.7 节 “路由 Slip”,用于评估 slip on-the-fly。
您必须确保用于 dynamicRouter
(如 bean)的表达式返回 null
以指示最终。否则,dynamicRouter
继续在无限循环中。
Camel 2.5 中的动态路由器以后 复制链接链接已复制到粘贴板!
在 Camel 2.5 中,第 8.18 节 “动态路由器” 会更新交换属性 Exchange.SLIP_ENDPOINT
,并在当前端点之前通过 slip 更新。这可让您了解交换通过 slip 的进度。(它是一个 slip,因为 第 8.18 节 “动态路由器” 实现基于 第 8.7 节 “路由 Slip”。
Java DSL 复制链接链接已复制到粘贴板!
在 Java DSL 中,您可以按照以下方法使用 dynamicRouter
:
from("direct:start") // use a bean as the dynamic router .dynamicRouter(bean(DynamicRouterTest.class, "slip"));
from("direct:start")
// use a bean as the dynamic router
.dynamicRouter(bean(DynamicRouterTest.class, "slip"));
这将利用 bean 集成来计算 slip on-the-fly,可按如下方式实施:
前面的示例 不是 线程安全。您需要在 Exchange
上存储状态以确保线程安全。
Spring XML 复制链接链接已复制到粘贴板!
Spring XML 中的相同示例为:
选项 复制链接链接已复制到粘贴板!
dynamicRouter
DSL 命令支持以下选项:
Name | 默认值 | 描述 |
|
| 如果 第 II 部分 “路由表达式和 predicates 语言” 返回多个端点,则使用分隔符。 |
|
| 如果端点 uri 无法解析,则应忽略它。否则 Camel 将抛出一个异常,表示 endpoint uri 无效。 |
@DynamicRouter 注释 复制链接链接已复制到粘贴板!
您还可以使用 @DynamicRouter
注释。例如:
当消息进度通过 slipes 时,会重复调用 路由
方法。其理念是返回下一个目的地的端点 URI。返回 null
以指示最终。如果您就像 第 8.7 节 “路由 Slip” 一样,您可以返回多个端点,其中每个端点用分隔符分开。