You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Paul D Johe (JIRA)" <ji...@apache.org> on 2018/12/03 20:35:00 UTC

[jira] [Commented] (CAMEL-12968) DefaultFluentProducerTemplate is not thread safe (endpoint, etc.)

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

Paul D Johe commented on CAMEL-12968:
-------------------------------------

We have worked around this issue by no longer using the FluentTemplateProducer this is produced in the CamelAutoConfiguration, but instead using @EndpointInject(uri=...) FluentTemplateProducer fields everywhere, thus avoiding the 'FluentTemplateProducer.to(...)' call.

Perhaps consider removing the FluentTemplateProducer from the camel autoconfig, or perhaps change the API altogether and have fluentTemplateProducer.createBuilder().to(...).body(...).header(...).send(); where createBuilder() always returns a new object instance that does not affect the state of the main fluentTemplateProducer object instance.

> DefaultFluentProducerTemplate is not thread safe (endpoint, etc.)
> -----------------------------------------------------------------
>
>                 Key: CAMEL-12968
>                 URL: https://issues.apache.org/jira/browse/CAMEL-12968
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>    Affects Versions: 2.22.1, 2.23.0
>            Reporter: Paul D Johe
>            Priority: Major
>
> The DefaultFluentProducerTemplate saves state between method calls. This leads to unexpected behavior when the javadoc specifies that it should be thread safe.
> For example:
>  # thread 1 calls fluentProducerTemplate.to("direct:a").send("message1");
>  # thread 2 calls fluentProducerTemplate.to("direct:b").send("message2");
> If these are run in parallel, the sequence of calls can be:
>  # thread 1 calls to("direct:a") - endpoint in the object is direct:a
>  # thread 2 calls to("direct:b") - endpoint in the object is direct:b
>  # *thread 1 calls send("message1") - this gets sent incorrectly to direct:b*
>  # thread 2 calls send("message2") - this gets sent correctly to direct:b
> Endpoint is one example, but almost all fields in this class share this behavior. It should be clearly documented which fields can be used fluently over multiple threads, and which cannot. As the API is today, all methods returning 'this' should be made thread-safe (state is only local to the caller) so that the fluent interface works as expected.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)