I have a couple of pretty simple routes and I need to define onCompletion behavior. Besides that I need to use route properties, where I store some required values - e.g.
<routeProperty key="NTX_COMP_ID" value="COMP_2" />
To get routeProperty values in onCompletion processor I have to get Route object:
String routeId = exchange.getFromRouteId();
Route route = exchange.getContext().getRoute(routeId);
My routes diagram is the following:
So the problem is that I can not get correct route in onCompletion for Route 1 on the diagram above - I am getting Route 2 instead. I understand that the reason is seda - async way, cz direct does not show such kind of problem. So - is there any way of getting correct Route in this situation?
My code:
<route id="component-1">
<from uri="timer:sample?period=15s"/>
<onCompletion mode="BeforeConsumer" parallelProcessing="false">
<setHeader name="NTX_CURRENT_COMPONENT">
<constant>component-1</constant>
</setHeader>
<!-- so this is a kinda like an after completion callback -->
<log message="${headers}"/>
<process ref="onCompletionHandler" />
<log message="${headers}"/>
</onCompletion>
<setBody>
<simple>Hello Entaxy! Component 1</simple>
</setBody>
<log message="${body}"/>
<!-- <to uri="direct-vm:toStep2"/> -->
<log message="${exchangeId}"/>
<to uri="direct-vm:toStep2"/>
<log message="${exchangeId}"/>
<log message="After step 2"/>
<to uri="direct-vm:toComp1-1"/>
<routeProperty key="NTX_COMP_ID" value="COMP_1" />
</route>
<route id="component-1-1">
<from uri="direct-vm:toComp1-1"/>
<onCompletion mode="BeforeConsumer" parallelProcessing="false">
<setHeader name="NTX_CURRENT_COMPONENT">
<constant>component-1</constant>
</setHeader>
<!-- so this is a kinda like an after completion callback -->
<log message="${headers}"/>
<process ref="onCompletionHandler" />
<log message="${headers}"/>
</onCompletion>
<log message="In comp 1-1"/>
<routeProperty key="NTX_COMP_ID" value="COMP_1" />
</route>
<route id="component-2">
<!-- <from uri="direct-vm:toStep2"/> -->
<from uri="direct-vm:toStep2"/>
<onCompletion mode="BeforeConsumer" parallelProcessing="false">
<setHeader name="NTX_CURRENT_COMPONENT">
<constant>component-2</constant>
</setHeader>
<!-- so this is a kinda like an after completion callback -->
<log message="${headers}"/>
<process ref="onCompletionHandler" />
<log message="${headers}"/>
</onCompletion>
<setBody>
<simple>Hello Entaxy! Component 2</simple>
</setBody>
<delay>
<constant>5000</constant>
</delay>
<log message="${body}"/>
<stop/>
<routeProperty key="NTX_COMP_ID" value="COMP_2" />
</route>
I have checked behavior with seda and direct, seda results in possibly wrong behavior.