Zoltán Nébli created CAMEL-16316:
------------------------------------
Summary: ProducerTemplate asyncSend is not thread safe
Key: CAMEL-16316
URL: https://issues.apache.org/jira/browse/CAMEL-16316
Project: Camel
Issue Type: Bug
Components: camel-base
Affects Versions: 3.1.0
Reporter: Zoltán Nébli
The
{code:java}
CompletableFuture<Exchange> asyncSend(String endpointUri, Processor
processor){code}
method is not thread safe because the processor is passed as a lambda to the
executor service:
{code:java}
getExecutorService().submit(() ->
getProducerCache().asyncSendExchange(endpoint, pattern, processor,
resultProcessor, inExchange, exchangeFuture));{code}
and therefore if the caller use the original Exchange reference in the
Processor, for example
{code:java}
request -> request.setBody(originalExchange.getIn().getBody(...)){code}
the executorService thread will use a dirty Exchange body in cases where the
original executor thread runs faster.
On the other hand this method is thread safe because the new Exchange object
can be populated from the original exchange:
{code:java}
CompletableFuture<Exchange> asyncSend(String endpointUri, Exchange
exchange){code}
I think the solution would be processing the request with the passed processor
then submit the job to the executor service or clearly mention this in the API
doc. This behavior is currently not straightforward.
Of course you can pass references with the 2. method also which will become
dirty but I think the clear intention here is sending a clean Exchange
asynchronously to an endpoint with either a Processor or an exact Exchange
object.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)