The loop pattern enables you to process a message multiple times. It is used mainly for testing.
![]() | Default mode |
---|---|
Notice by default the loop uses the same exchange throughout the looping. So the result from the previous iteration is 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. |
On each loop iteration, two exchange properties are set, which can optionally be read by any processors included in the loop.
Property | Description |
---|---|
CamelIterationCount
|
Fuse Mediation Router 1.x: Total number of iterations to be run |
CamelIterationIndex
|
Fuse Mediation Router 1.x: Index of the current iteration (0 based) |
CamelLoopSize
|
Fuse Mediation Router 2.0: Total number of loops |
CamelLoopIndex
|
Fuse Mediation Router 2.0: Index of the current iteration (0 based) |
The following examples show how to take a request from the direct:x
endpoint
and then send the message repeatedly to mock:result
. The number of loop
iterations is specified either as an argument to loop()
or by evaluating an
expression at run time, where the expression must evaluate to an
int
(or else a RuntimeCamelException
is
thrown).
The following example passes the loop count as a constant:
from("direct:a").loop(8).to("mock:result");
The following example evaluates a simple expression to determine the loop count:
from("direct:b").loop(header("loop")).to("mock:result");
The following example evaluates an XPath expression to determine the loop count:
from("direct:c").loop().xpath("/hello/@times").to("mock:result");
You can configure the same routes in Spring XML.
The following example passes the loop count as a constant:
<route> <from uri="direct:a"/> <loop> <constant>8</constant> <to uri="mock:result"/> </loop> </route>
The following example evaluates a simple expression to determine the loop count:
<route> <from uri="direct:b"/> <loop> <header>loop</header> <to uri="mock:result"/> </loop> </route>
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.
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 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>
The loop
DSL command supports the following options:
Name | Default Value | Description |
---|---|---|
copy
|
false
|
Camel 2.8: Whether or not copy mode is used. If
false then the same Exchange is being used throughout the looping. So
the result from the previous iteration will be visible for the next
iteration. Instead you can enable copy mode, and then each iteration is
restarting with a fresh copy of the input Exchange. |