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

Max commented on CAMEL-19346:
-----------------------------

yes, looks like it solved the issue.

my concurrency test which was failing with 3.20.5 passes with 3.21.0

> Builder.simple expression is not thread safe
> --------------------------------------------
>
>                 Key: CAMEL-19346
>                 URL: https://issues.apache.org/jira/browse/CAMEL-19346
>             Project: Camel
>          Issue Type: Bug
>          Components: came-core
>    Affects Versions: 3.20.2, 3.20.3, 3.20.4
>            Reporter: Max
>            Priority: Major
>
> First of all I have to apologize, cannot provide demo project to reproduce 
> the error. So, this is the issue:
> using route something like this:
> {code:java}
> from(activemq..?consumerCount=5).bean(MyBean.class).to("http:foo.bar/url") 
> {code}
> {code:java|title=application.yaml}
> foo.base.url: http://foo.bar/foo
> {code}
> {code:java}
> import org.apache.camel.builder.SimpleBuilder;
> import static org.apache.camel.builder.Builder.simple;
> public class MyBean { 
> public static final String PART1 = "{{foo.base.url}}";
> public static final String PART2 = "$simple{header.fooId}"
> public static final String FULL_URL = PART1 + "/" + PART2;
> @Handler
> public void process(Exchange exchange) {
>     var allInOne = simple(FULL_URL).evaluate(exchange, String.class);
>     var allInOneWithSB = SimpleBuilder.simple(FULL_URL).evaluate(exchange,   
> String.class);
>     var part1 = simple(PART1).evaluate(exchange, String.class);
>     var part2 = simple(PART2).evaluate(exchange, String.class);
>     var builtFromParts1 = part1 + "/" + message.getHeader("myId");
>     var builtFromParts2 = part1 + "/" + part2;
>     message.setHeader(Exchange.HTTP_URI, allInOne); // sometimes broken
>     message.setHeader(Exchange.HTTP_URI, allInOneWithSB); // sometimes broken
>     message.setHeader(Exchange.HTTP_URI, builtFromParts1); // always correct
>     message.setHeader(Exchange.HTTP_URI, builtFromParts2); // always correct
> }{code}
> The issue:
> When {{MyBean}} is used in a single thread (1 queue consumer) everything 
> works fine. 
> When {{MyBean}} is used with multiple queue consumers after some time (about 
> 50 messages with 5 consumers) starts messing up the Exchange.HTTP_URI value. 
> So instead of always having url like 
> {code:java}
> http://foo.bar/foo/1
> http://foo.bar/foo/2
> ...
> http://foo.bar/foo/1024
> {code}
> we start getting weird results such as
> {code:java}
> http://foo.bar/foo/1
> http://foo.bar/foo/http://foo.bar/foo/1
> http://foo.bar/foo/11
> {code}
> After experimenting I suspect that the {{Builder.simple}} expression is not 
> thread safe  or has some internal caching which causes the 
> {{{{{}expression{}}}}} to collide with $simple\{header.foo} when used 
> together in the same string.
> So it takes the result of {{{{{}expression{}}}}} sets to some internal cache 
> then takes that value and adds the same value + result of 
> ${simple\{header.foo}
> When the expressions are evaluated separately Builder.simple() produces 
> correct result.
> Tried to use deprecated SimpleBuilder.simple() expression and hit the same 
> issue.
> So even though {{allInOne}} and {{allInOneWithSB were}} broken, other values 
> such as {{{}builtFromParts1{}}}, {{builtFromParts2}} at the same time were 
> allways correct no matter how often and how many concurrent consumers I used.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to