8.16. loop
loop 复制链接链接已复制到粘贴板!
loop 模式允许您多次处理消息。它主要用于测试。
默认情况下,循环在循环过程中使用相同的交换。上一个迭代的结果用于下一个(请参阅 第 5.4 节 “pipes 和 Filters”)。您可以从 上的 Camel 2.8 来启用复制模式。详情请查看 options 表。
Exchange 属性 复制链接链接已复制到粘贴板!
在每个循环迭代中,会设置两个交换属性,可选择性地读取循环中包含的任何处理器。
| 属性 | 描述 |
|---|---|
|
| Apache Camel 2.0: 总数 |
|
| Apache Camel 2.0:当前迭代的索引(基于 0) |
Java DSL 示例 复制链接链接已复制到粘贴板!
以下示例演示了如何从 direct:x 端点获取请求,然后重复将消息发送到 模拟结果。循环迭代数量被指定为 loop() 的参数,或者通过评估表达式在运行时评估表达式,其中表达式 必须 评估到 int (或者其它 运行时操作Exception 被抛出)。
以下示例将循环计数作为恒定进行传递:
from("direct:a").loop(8).to("mock:result");
以下示例评估了一个简单的表达式来确定循环计数:
from("direct:b").loop(header("loop")).to("mock:result");
以下示例评估了一个 XPath 表达式来确定循环计数:
from("direct:c").loop().xpath("/hello/@times").to("mock:result");
XML 配置示例 复制链接链接已复制到粘贴板!
您可以在 Spring XML 中配置相同的路由。
以下示例将循环计数作为恒定进行传递:
<route>
<from uri="direct:a"/>
<loop>
<constant>8</constant>
<to uri="mock:result"/>
</loop>
</route>
以下示例评估了一个简单的表达式来确定循环计数:
<route>
<from uri="direct:b"/>
<loop>
<header>loop</header>
<to uri="mock:result"/>
</loop>
</route>
使用复制模式 复制链接链接已复制到粘贴板!
现在假定我们发送一条消息以包括字母 A。处理此路由的输出将是该路由,每个 模拟:loop 端点将接收 AB 作为消息。
from("direct:start")
// instruct loop to use copy mode, which mean it will use a copy of the input exchange
// for each loop iteration, instead of keep using the same exchange all over
.loop(3).copy()
.transform(body().append("B"))
.to("mock:loop")
.end()
.to("mock:result");
但是,如果没有 启用复制模式,那么 loop 将接收 ABB、ABB 消息。
from("direct:start")
// by default loop will keep using the same exchange so on the 2nd and 3rd iteration its
// the same exchange that was previous used that are being looped all over
.loop(3)
.transform(body().append("B"))
.to("mock:loop")
.end()
.to("mock:result");
复制模式的 XML DSL 中的等效示例如下:
<route>
<from uri="direct:start"/>
<!-- enable copy mode for loop eip -->
<loop copy="true">
<constant>3</constant>
<transform>
<simple>${body}B</simple>
</transform>
<to uri="mock:loop"/>
</loop>
<to uri="mock:result"/>
</route>
选项 复制链接链接已复制到粘贴板!
loop DSL 命令支持以下选项:
| 名称 | 默认值 | 描述 |
|
|
|
Camel 2.8: 是否使用复制模式。若为 |
Dole Loop 复制链接链接已复制到粘贴板!
您可以执行循环,直到在 loop 使用一个条件满足条件。该条件可以是 true 或 false。
在 DSL 中,命令为 Loop DoWhile。以下示例将执行循环,直到邮件正文长度为 5 个字符或更少:
from("direct:start")
.loopDoWhile(simple("${body.length} <= 5"))
.to("mock:loop")
.transform(body().append("A"))
.end()
.to("mock:result");
在 XML 中,命令是 loop 的 doWhile。以下示例还执行循环,直到邮件正文长度为 5 个字符或更少:
<route>
<from uri="direct:start"/>
<loop doWhile="true">
<simple>${body.length} <= 5</simple>
<to uri="mock:loop"/>
<transform>
<simple>A${body}</simple>
</transform>
</loop>
<to uri="mock:result"/>
</route>