ThrottlerThe Throttler Pattern allows you to ensure that a specific endpoint does not get overloaded, or that we don't exceed an agreed SLA with some external service. Options
ExamplesUsing the Fluent Builders from("seda:a").throttle(3).timePeriodMillis(10000).to("log:result", "mock:result"); So the above example will throttle messages all messages received on seda:a before being sent to mock:result ensuring that a maximum of 3 messages are sent in any 10 second window. Note that typically you would often use the default time period of a second. So to throttle requests at 100 requests per second between two endpoints it would look more like this... from("seda:a").throttle(100).to("seda:b"); For further examples of this pattern in use you could look at the junit test case Using the Spring XML Extensions Camel 2.7.x or older<route> <from uri="seda:a" /> <throttle maximumRequestsPerPeriod="3" timePeriodMillis="10000"> <to uri="mock:result" /> </throttle> </route> Camel 2.8 onwardsIn Camel 2.8 onwards you must set the maximum period as an Expression as shown below where we use a Constant expression: <route> <from uri="seda:a"/> <!-- throttle 3 messages per 10 sec --> <throttle timePeriodMillis="10000"> <constant>3</constant> <to uri="mock:result"/> </throttle> </route> Dynamically changing maximum requests per periodAvailable os of Camel 2.8 <route> <from uri="direct:expressionHeader"/> <throttle timePeriodMillis="500"> <!-- use a header to determine how many messages to throttle per 0.5 sec --> <header>throttleValue</header> <to uri="mock:result"/> </throttle> </route> Asynchronous delayingAvailable as of Camel 2.4 You can let the Throttler use non blocking asynchronous delaying, which means Camel will use a scheduler to schedule a task to be executed in the future. The task will then continue routing. This allows the caller thread to not block and be able to service other messages etc. from("seda:a").throttle(100).asyncDelayed().to("seda:b"); 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. |