[ 
https://issues.apache.org/jira/browse/CAMEL-9355?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15030369#comment-15030369
 ] 

Aaron Whiteside commented on CAMEL-9355:
----------------------------------------

Actually I think you're right, there is a better way, after a some 
investigation I believe I can achieve the same thing without using a dedicated 
thread to release permits, I should be able to use a DelayQueue in place of a 
Semaphore. 

I'll work on the updating patch...

> Current Throttler implementation is not accurate and does not work in a 
> multi-threaded route
> --------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-9355
>                 URL: https://issues.apache.org/jira/browse/CAMEL-9355
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-core
>    Affects Versions: 2.16.0
>            Reporter: Aaron Whiteside
>         Attachments: CAMEL_9355.patch
>
>
> Current Throttler implementation is not accurate and is even more inaccurate 
> in a multi-threaded route (think sjms....consumerCount=100).
> The delay to sleep cannot be calculated ahead of time in a multi-threaded 
> environment, to this end the Throttler should not extend 
> DelayProcessorSupport.
> Attached is a patch that changes throttler to use a Semaphore to do accurate 
> and multi-thread safe throttling.
> The code I think is much cleaner, smaller and easier to understand. Than it 
> used to be before.
> Unit tests still pass, I had to make some changes to ThrottlerTest as it made 
> assumptions about the implementation and was doing bad things like adding a 
> 750ms buffer to validating the minimum throttle delay.. ThrottlerTest is now 
> very sane.
> I've also implemented support to allow the throttler construct to be used 
> without any nested outputs. For example the follow code is now valid.
> {code}
> <throttle><constant>100</constant></throttle> 
> {code}
> If you want to disable this feature it can be done in 
> ThrottlerDefinition::createProcessor() line 82 changing false to true.
> I think this allows more flexible usage of the throttler, in my use case I 
> want to delay the further execution of the route, and I don't want to have to 
> split my routes up into separate sub-routes to be able to do that. 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to