Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Loop

The Loop allows to process the for processing a message a number of times and , possibly process them in a different way for each iteration. Useful mostly for testing.during testing.

...

Notice by default the loop uses the same exchange throughout the looping. So the result from the previous iteration will be used for the next (eg Pipes and Filters). From Camel 2.8 onwards you can enable copy mode instead. See the options table for more details.

Options

...

Name

Default Value

Description

copy

false

Camel 2.8: Whether or not copy mode is used. If false then the same Exchange will be used for each iteration. So the result from the previous iteration will be visible for the next iteration. Instead you can enable copy mode, and then each iteration restarts with a fresh copy of the input Exchange.

doWhile Camel 2.17: Enables the while loop that loops until the predicate evaluates to false or null.

Exchange properties

For each iteration two properties are set on the Exchange that could be used by processors down the pipeline . Processors can rely on these properties to process the Message in different ways.

Property

Description

CamelIterationCount CamelLoopSize

Camel 1.x: Total number of iterations to be run

CamelIterationIndex

Camel 1.x: Index of the current iteration (0 based)

CamelLoopSize

Camel 2.0: Total number of loops

loops. This is not available if running the loop in while loop mode.

CamelLoopIndex

CamelLoopIndex

Camel 2.0: Index of the current iteration (0 based)

that could be used by processors down the pipeline to process the Message in different ways.

Examples

The following example shows how to take a request from the direct:x endpoint, then send the message repetitively to mock:result. The number of times the message is sent is either passed as an argument to loop(), or determined at runtime by evaluating an expression. The expression must evaluate to an int, otherwise a RuntimeCamelException is thrown.

...

Pass loop count as an argument

...

{snippet:id=ex1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/LoopTest.java}

...

Use expression to determine loop count

...

{snippet:id=ex2|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/LoopTest.java}

...

Use expression to determine loop count

...

{snippet:id=ex3|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/LoopTest.java}

...

Using the Spring XML Extensions

Pass loop count as an argument

...

{snippet:id=ex1|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/loop.xml}

...

Use expression to determine loop count

...

{snippet:id=ex2|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/loop.xml}

...

For further examples of this pattern in use you could look at one of the junit test case

...

Using copy mode

Available as of Camel 2.8

Now suppose we send a message to "direct:start" endpoint containing the letter A.
The output of processing this route will be that, each "mock:loop" endpoint will receive "AB" as message.{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/LoopCopyTest.java}However if we do not enable copy mode then "mock:loop" will receive "AB", "ABB", "ABBB", etc. messages.{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/LoopNoCopyTest.java}The equivalent example in XML DSL in copy mode is as follows:{snippet:id=e1|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringLoopCopyTest.xml}

Using while mode

Available as of Camel 2.17

The loop can act like a while loop that loops until the expression evaluates to false or null.

For example the route below loops while the length of the message body is 5 or less characters. Notice that the DSL uses loopDoWhile.

...

And the same example in XML:

...

Notice in XML that the while loop is turned on using the doWhile attribute.

 

...

Using This Pattern