Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: further cleanup
Wiki Markup
h2. Loop
The Loop allows for processing a message a number of times, possibly in a different way for each iteration.  Useful mostly during testing.

{info:title=Default mode}
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.
{info}

h3. Options
{div:class=confluenceTableSmall}
|| 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]. |

h3. Exchange properties
For each iteration two properties are set on the {{Exchange}}. that couldProcessors becan usedrely byon processors down the pipelinethese properties to process the [Message] in different ways.
|| Property || Description ||
| {{CamelLoopSize}} | Total number of loops |
| {{CamelLoopIndex}} | Index of the current iteration (0 based) |

Processors can rely on the above information to process the [Message] in different ways.

h4. 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.

*Using the [Fluent Builders]*

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|http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/LoopTest.java?view=markup]

h4. 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}


{include:Using This Pattern}