2
votes

Can anyone please give a sample on how to dynamically change the maxRequestsPerPeriod by using a Throttler processor instance or using a throttle element in Apache Camel ? (Reference - How to change Processor properties during runtime using Camel?)

We cannot use Expression with header because if the header is absent then the Throttler uses the old value. What we need is, in a bean based on some condition we have to update the throttle value so that it will be used until next update. In our case, we cannot use message header for this purpose.

How can we navigate the runtime processors in the route and find the Throttler to change it dynamically? Please help with a sample.

Thanks.

2

2 Answers

2
votes

Thanks Claus..We will check jmx mbeans in upcoming Camel 2.16 release.

Now the following solution worked for us with Camel 2.15.2 :

Java DSL:

from("direct:start")
  .routeId("throttleroute")
  .throttle(ExpressionBuilder.beanExpression("throttleBean","getThrottle"))
  .timePeriodMillis(2000)
  .to("jms:test.MyQueue")
  .beanRef("throttleBean", "receiveData");

Spring DSL:

<route id="throttleroute">
    <from uri="direct:start" />
        <throttle timePeriodMillis="2000">
            <method ref="throttleBean" method="getThrottle" />
            <to uri="jms:test.MyQueue" />
        </throttle>
    <to uri="bean:throttleBean?method=receiveData" />
</route>

Here throttleBean.getThrottle() method will be having the logic to generate and return the required throttle value dynamically.

0
votes

You can change it using JMX eg the management api.

The mbean has JMX attributes to change the values at runtime.

In the upcoming Camel 2.16 release you can easier get hold of the jmx mbeans from java code using

Just that you know the id of the mbean. You can assign ids in the routes, so its using a known id, instead of auto generated. Which btw also makes it easier to find the mbean using pure JMX api.