LoopThe Loop allows for processing a message a number of times, possibly in a different way for each iteration. Useful mostly during testing.
Options
Exchange propertiesFor each iteration two properties are set on the Exchange. Processors can rely on these properties to process the Message in different ways.
ExamplesThe 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 from("direct:a").loop(8).to("mock:result"); Use expression to determine loop count from("direct:b").loop(header("loop")).to("mock:result"); Use expression to determine loop count from("direct:c").loop().xpath("/hello/@times").to("mock:result"); Using the Spring XML Extensions Pass loop count as an argument <route> <from uri="direct:a"/> <loop> <constant>8</constant> <to uri="mock:result"/> </loop> </route> Use expression to determine loop count <route> <from uri="direct:b"/> <loop> <header>loop</header> <to uri="mock:result"/> </loop> </route> For further examples of this pattern in use you could look at one of the junit test case Using copy modeAvailable as of Camel 2.8 Now suppose we send a message to "direct:start" endpoint containing the letter A. 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"); However if we do not enable copy mode then "mock:loop" will receive "AB", "ABB", "ABBB", etc. messages. 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"); The equivalent example in XML DSL in copy mode is as follows: <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> Using This PatternIf you would like to use this EIP Pattern then please read the Getting Started, you may also find the Architecture useful particularly the description of Endpoint and URIs. Then you could try out some of the Examples first before trying this pattern out. |