[
https://issues.apache.org/jira/browse/CAMEL-22364?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen reassigned CAMEL-22364:
-----------------------------------
Assignee: Claus Ibsen
> camel-jms - Rare ConcurrentModificationException on message header map when
> using multiple camel-jms calls after each other in route
> ------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-22364
> URL: https://issues.apache.org/jira/browse/CAMEL-22364
> Project: Camel
> Issue Type: Bug
> Components: camel-jms
> Affects Versions: 4.4.5, 4.5.0, 4.6.0, 4.8.8, 4.9.0, 4.10.6, 4.11.0,
> 4.12.0, 4.13.0, 4.14.0
> Reporter: Vladimir Dobos
> Assignee: Claus Ibsen
> Priority: Major
> Fix For: 4.8.9, 4.10.7, 4.14.1, 4.15.0
>
> Attachments: access_history.txt, camel.log
>
>
> When calling multiple camel-jms endpoints in sequence in one route, there is
> a random possibility of ConcurrentModificationException on header map during
> route execution when using more than 1 thread to run the route (see
> stacktrace on line 12 in attached log file camel.log) for details.
> I wrote simple program to simulate the issue
> (https://github.com/vdobos-tr/TestJmsConcurrentModification), program
> contains both client (RageCallMQ.java using jmh, run by jmh.sh) and backend
> (CamelMain, executed usually from my IDE) part, client uses JMH to tax the
> camel-jms endpoints and cause the exception. We use IBM MQ as a message
> broker (added example compose in directory mq-compose, requires path
> modification to run).
> Probability and time until the exception happens depends heavily on hardware
> and general setup of the host machine. Our customers can easily replicate the
> issue in their test environments running 20 consumers and simple route
> (from(jms, in only).process().to(jms, inout).process(...).to(jms, out only))
> whereas we had to run 50-75 threads and up to 6 orchestrations to get one
> exception within 30 minutes of execution (from(jms, in
> only).process().[to(jms, inout).process(...)<repeat 6 times>].to(jms, out
> only)). As a race condition, unfortunatelly, the timing when the exception
> occuring is very random, sometimes it can occur within first minute,
> sometimes it can take 30+ minutes :(.
> Exception occurs regardless if CachingConnectionFactory is used and regardles
> of asyncConsumer setting. ConcurrentModificationException is caused by
> parallel acces of two threads to headers map on message (I used custom
> HeadersMapFactory and custom map implementation with some Proxy classes to
> trace the issue, see package cz.trask.bi.mq.camel.debugmap in application)
> I was able to trace the issue to change in camel 4.4.0
> (https://issues.apache.org/jira/browse/CAMEL-20338, see file
> access_history.txt, lines 78 to 200 and line 202 created by custom Headers
> Map that shows thread acces causing the issue).
> As far as I understand the problem, it is posible for doSend(...) on line 260
> in JmsProducer to not finish (maybe OS schduler parking threads ?) until next
> thread processing next part of route received response from backend and is
> already sending next request (or final response) in route (header map
> iteration on line 368 of JmsBinfding, where the stacktrace originates),
> during this iteration original doSend(...) on line on line 260 in
> JmsProducer resumes and hits lines 260-262, added by CAMEL-20338, causing
> ConcurrentModificationException on next loop iteration in JmsBinding, line
> 368.
> I tested the issue on camel 4.4.0, 4.8.3 - the version of apache camel we and
> our customers are currently using, 4.10.6, 4.13.0 and also newly relased
> 4.14.0 and it occurs on all of them.
> Apache camel releases before canel 4.4.0 (4.3.0, 4.2.0, 4.1.0, 4.0.0) do not
> manifest the issue.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)