[ 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)