I'm running into a very odd problem that happens only under very specific circumstances. I have the following route
<routes id="id1" xmlns="http://camel.apache.org/schema/spring">
<route id="id2">
<from uri="{{input}}"/>
<log message="Started route"/>
<transacted/>
<doTry>
<multicast>
<pipeline>
<log message="Started 1" />
<log message="Finished 1" />
</pipeline>
<pipeline>
<log message="Started 2" />
<log message="Finished 2" />
</pipeline>
</multicast>
<log message="Finished multi"/>
<doCatch>
<exception>java.lang.Exception</exception>
<log message="Exception happened"/>
</doCatch>
</doTry>
</route>
</routes>
This prints the following
Started route
Started 1
Finished 1
Started 2
Finished 2
It then hangs until you terminate the process. Finished multi
is never logged. After 10 seconds I get a message from Atomikos (the transaction manager) that looks like
Transaction tm168555531112800002 has timed out and will rollback.
When I terminate the process, camel tells me there's 1 inflight exchange for route id2
. Graceful shutdown fails after 10 seconds and it has to kill the main thread.
The following threads are blocked and will be interrupted so the threads are released
Blocked Thread --- Id: 1 Name: main RouteId: id2 NodeId: multicast1
Now here's the fun part. Changing the route in any of these ways fixes the problem and everything works as expected:
- Removing one of the log messages from the second pipeline. Doesn't matter what you put in the first one, the second pipeline must contain only a single line.
- Removing one pipeline block completely
- Making the multicast concurrent with
parallelProcessing = true
- Removing
<transacted/>
- Moving the multicast outside
<doTry>
I'm using Camel 3.15.0 with Spring Boot 2.6.4