8.16. loop
loop
循环 模式允许您多次处理消息。它主要用于测试。
默认情况下,循环在整个循环中使用相同的交换。以上迭代的结果用于下一个迭代(请参阅 第 5.4 节 “管道和过滤器”)。在 Camel 2.8 中,您可以启用复制模式。详情请查看 options 表。
Exchange 属性
在每个循环迭代中,会设置两个交换属性,它们可以选择由循环中包含的任何处理器读取。
属性 | 描述 |
---|---|
| Apache Camel 2.0:循环总数 |
| Apache Camel 2.0:当前迭代的索引(基于 0) |
Java DSL 示例
以下示例演示了如何从 direct:x
端点获取请求,然后将消息重复发送到 mock:result
。循环迭代数量指定为 loop ()
的参数,或者在运行时评估表达式,其中表达式 必须 评估为 int
(或其他 RuntimeCamelException
被抛出)。
以下示例将循环数作为常数传递:
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>
使用复制模式
现在,假设我们向 direct:start
端点发送包含字母 A 的 direct:start 端点。处理此路由的输出将是这样,每个 mock: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");
但是,如果没有 启用复制模式,则 mock:loop
将接收 AB、ABB、ABB、ABBB 消息。
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: 是否使用复制模式。如果为 |
do While Loop
您可以使用 do
循环执行循环,直到条件满足。该条件可以是 true 或 false。
在 DSL 中,命令为 LoopDoWhile
。以下示例将执行循环,直到消息正文长度为 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>