8.16. 循环


循环

循环 模式允许您多次处理消息。它主要用于测试。

默认情况下,循环在整个循环中使用相同的交换。上一个迭代的结果用于下一个(请参阅 第 5.4 节 “管道和过滤器”)。在 Camel 2.8 上,您可以改为启用复制模式。详情请查看选项表。

交换属性

在每个循环迭代中,会设置两个交换属性,它们可以被循环中包含的任何处理器(可选)读取。

属性描述

CamelLoopSize

Apache Camel 2.0:循环总数

CamelLoopIndex

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。处理此路由的输出将是这样,每个 模拟:循环 端点将接收 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 将接收 AB、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>

选项

循环 DSL 命令支持以下选项:

Name

默认值

描述

复制

false

Camel 2.8: 是否使用是否使用复制模式。如果为 false,则整个循环中会使用相同的 Exchange。因此,来自以前的迭代的结果将在下一次迭代 中可见。相反,您可以启用复制模式,然后每个迭代都会使用输入 “Exchanges”一节 的新副本 重启

do While Loop

在循环 时,您可以使用 do a 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>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.