Closed bvahdat closed 2 years ago
I had a very brief look at this. It worked back in CQ 2.4.0 but is broken afterwards in CQ 2.5.0. It's possibly related to this change in Camel:
https://github.com/apache/camel/commit/961ad0e56e9331e71c386415ec67676e586ea629
Waiting for the result of the split operation seems to hang here:
@bvahdat when you say the very same routing logic works perfectly using standalone Camel
, is that with camel-jta
? Or something else?
Hi @jamesnetherton
I have not used camel-jta
but plain local JDBC transaction to see if that would work at all, and it did.
I used this test:
And added one more test:
public void testTransactedSplit() throws Exception {
getMockEndpoint("mock:splitted").expectedBodiesReceived("requires", "new", "2");
template.sendBody("direct:requires_new_2", "requires_new_2");
assertMockEndpointsSatisfied();
}
And these additional 2 routes (the exact same route what fails by this ticket):
from("direct:requires_new_2")
.transacted("PROPAGATION_REQUIRES_NEW")
.split(body()).delimiter("_").to("direct:splitted").end()
.log("after splitter log which you will never see...")
.transform().constant("requires_new_2");
from("direct:splitted").to("mock:splitted");
But I guess if we would use camel-jta
instead with narayana then that should be a reproducer, right?
But I guess if we would use camel-jta instead with narayana then that should be a reproducer, right?
Yeah. I think the issue is in camel-jta
or MulticastTransactedTask
. I don't think there's something specific in Camel Quarkus or Narayana that is causing it.
OK, I will take a close look this week.
@jamesnetherton @zhfeng
I am also failing to reproduce the issue using pure Camel + JTA + Narayana (and not only using local TX as originally above with the local spring-tx
JDBC transaction):
https://github.com/bvahdat/camel/commit/d73cd0df7ca61d799069a31320900b0df494b6e8
Well it's not to 100% the same as
Is not the same Wiring / Setup TX-Impl as:
Thanks a lot for looking into this, much appreciated!
@zhfeng ~here is a camel issue, which causes deadlock with multicast - https://issues.apache.org/jira/browse/CAMEL-17474 You can verify if this issue is related by omitting following revision in camel - https://github.com/apache/camel/commit/961ad0e56e9331e71c386415ec67676e586ea629~
Please ignore mu comment. Camel issue is happening on camel 3.14.0
, but this issue is said to work on 3.14.0
.
@bvahdat I agree with @jamesnetherton and it could be related to https://github.com/apache/camel/commit/961ad0e56e9331e71c386415ec67676e586ea629 which introduce void scheduleQueue(Runnable runnable)
used for routing Exchange using transactions.
Also It looks like the camel-spring and camel-jta has a slight different with TransactionErrorHandler::processByErrorHandler(final Exchange exchange)
protected void processByErrorHandler(final Exchange exchange) {
awaitManager.process(new AsyncProcessorSupport() {
@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
return TransactionErrorHandler.super.process(exchange, callback);
}
}, exchange);
}
protected void processByErrorHandler(final Exchange exchange) {
try {
output.process(exchange);
} catch (Throwable e) {
throw new RuntimeCamelException(e);
}
}
That maybe be the reason that your reproducer is failing with camel-spring.
I'm trying to reproduce this issue with camel-jta
and I belive this should be fixed in the upstream Camel but not CQ.
I have probably a related behavior (see https://camel.zulipchat.com/#narrow/stream/257302-camel-quarkus/topic/use.20mdc.20logging.20and.20breadcrumb/near/271284700) trying to log the routeId and breadcrumbId of a transacted route with:
from("jms:queue/transacted?connectionFactory=#xaConnectionFactory")
.routeId("transactedRoute")
// remove this line and the routeId and breadcrumbId will be in the logs
.transacted("PROPAGATION_REQUIRED")
.log(LoggingLevel.INFO, "another message")
.to("log:done?level=INFO");
and
camel.main.useMdcLogging=true
camel.main.useBreadcrumb=true
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) [%X{camel.routeId}/%X{camel.breadcrumbId}] %s%e%n
Maybe have also a look an that. Thanks
The upstream fix in camel https://github.com/apache/camel/pull/7014
camel-3.14.2 and camel-3.16.0 should includes the fixes. So I think this issue should be fixed in camel-quarkus-2.7.1 and camel-quarkus-2.8.0
See the following added route:
https://github.com/bvahdat/camel-quarkus/commit/4ba0d2dad669742c6e8a1bfa1bab456b97eb2553
Which ends up with:
However the very same routing logic works perfectly using standalone Camel version
3.14.0
.Cc: @zhfeng