You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Max (Jira)" <ji...@apache.org> on 2023/05/13 00:17:00 UTC

[jira] [Created] (CAMEL-19346) simple evaluator not thread safe

Max created CAMEL-19346:
---------------------------

             Summary: simple evaluator 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.4, 3.20.3, 3.20.2
            Reporter: Max


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;

    // at the same moment when allInOne is broken, other ones look good
    message.setHeader(Exchange.HTTP_URI, allInOne); // sometimes broken
    message.setHeader(Exchange.HTTP_URI, allInOneWithSB); // always correct
    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.

However, this issue never happened with deprecated SimpleBuilder.simple() expression.

So even though {{allInOne}} was broken, other values such as {{{}allInOneWithSB{}}}, {{{}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)