THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
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} |