Dirk Fiedler created CAMEL-21216:
------------------------------------
Summary: Apache Camel LRA does not work with Oracle MicroTX LRA
coordinator
Key: CAMEL-21216
URL: https://issues.apache.org/jira/browse/CAMEL-21216
Project: Camel
Issue Type: Bug
Components: camel-lra
Affects Versions: 4.7.0
Reporter: Dirk Fiedler
{color:#000000}Hi Team,{color}
{color:#000000}we are using the Apache Camel LRA components within Java
Springboot projects to implement saga services.{color}
{color:#000000}Till now, we are using Narayana as an LRA-Coordinator. Now we
want to switch to Oracl MicroTX {color}
{color:#000000}(https://docs.oracle.com/en/database/oracle/transaction-manager-for-microservices/24.2/tmmdg/lra-transaction-protocol.html).{color}
{color:#000000}After configuring Oracle MircoTX instead of Narayana, we are
facing two problems within the {color}
{color:#000000}Apache Camel LRA component code.{color}
{color:#0451a5}1){color}{color:#000000} While joining an LRA Transaction, the
payload sent by Apache Camel is URL encoded{color}
{color:#0451a5}2){color}{color:#000000} The Query parameter sent by Oracle LRA
coordinator are url encoded, but will not be decoded by Apache Camal LRA (see
also: CAMEL-21197){color}
{color:#000000}I will set up a branch with my suggested code changes and link
this afterwards to this jira bug.{color}
{color:#000000}The code changes are completely backwards compatible with
Narayana (already tested).{color}
{color:#0451a5}1){color}{color:#000000} Joining an LRA Transaction{color}
{color:#000000}The class 'LRAClient' is using 'LRAUrlBuilder' inside Method
'join'. All parts of the http put body are url encoded. {color}
{color:#000000}Within Oracle LRA Coordinator log i can see the incomming
request from Apache Camel:{color}
{code:java}
<https://k5-mmeeasysaga.qa-servicebuilder-dev.svc.cluster.local/camel/compensate?Camel-Saga-Complete=direct%3A%2F%2Fsaga1_sagaService_complete>;
rel=compensate,<https://k5-mmeeasysaga.qa-servicebuilder-dev.svc.cluster.local/camel/complete?Camel-Saga-Complete=direct%3A%2F%2Fsaga1_sagaService_complete>;
rel=complete{code}
{color:#000000}This url encoded query param
'Camel-Saga-Complete=direct%3A%2F%2Fsaga1_sagaService_complete' will be encoded
again on Oracle LRA Coordinator side.{color}
{color:#000000}This is causing the error message within Apache Camel LRA:{color}
{code:java}
o.a.c.RuntimeCamelException: Cannot join LRA at
o.a.c.s.l.LRAClient.lambda$join$2(LRAClient.java:138) ... 10 common frames
omitted Wrapped by: j.u.c.CompletionException:
org.apache.camel.RuntimeCamelException: Cannot join LRA at
j.u.c.CompletableFuture.encodeThrowable(Unknown Source) at
j.u.c.CompletableFuture.completeThrowable(Unknown Source) at
j.u.c.CompletableFuture$UniApply.tryFire(Unknown Source) at
j.u.c.CompletableFuture.postComplete(Unknown Source) at
j.u.c.CompletableFuture.postFire(Unknown Source) at
j.u.c.CompletableFuture$UniWhenComplete.tryFire(Unknown Source) at
j.u.c.CompletableFuture$Completion.exec(Unknown Source) at
j.u.c.ForkJoinTask.doExec(Unknown Source) at
j.u.c.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source) at
j.u.c.ForkJoinPool.scan(Unknown Source) at
j.u.c.ForkJoinPool.runWorker(Unknown Source) at
j.u.c.ForkJoinWorkerThread.run(Unknown Source){code}
{color:#000000}When logging the result http code and body{color}
{code:java}
LOG.error("error while joining LRA: {} / {}", response.statusCode(),
response.body());{code}
{color:#000000}i am getting this:{color}
{code:java}
error while joining LRA: 400 / error: URL is double encoded{code}
{color:#000000}The problem can be solved by not url encoding the given urls
within the joinLRA payload.{color}
org.apache.camel.service.lra.LRAUrlBuilder -> query:
This code should not be executed:
{code:java}
key = URLEncoder.encode(toNonnullString(key), StandardCharsets.UTF_8.name());
value = URLEncoder.encode(toNonnullString(value),
StandardCharsets.UTF_8.name());
{code}
{color:#0451a5}2){color}{color:#000000} Decode given query parameter from
Oracle LRA-Coordinator call{color}
{color:#000000}After solving 1), i am getting a new exception:{color}
{code:java}
j.l.IllegalArgumentException: URI direct%3A%2F%2Fsaga1_sagaService_complete is
not allowed at o.a.c.s.l.LRASagaRoutes.verifyRequest(LRASagaRoutes.java:107)
at o.a.c.s.p.DelegateSyncProcessor.process(DelegateSyncProcessor.java:65) at
o.a.c.p.e.RedeliveryErrorHandler$SimpleTask.handleFirst(RedeliveryErrorHandler.java:440)
at
o.a.c.p.e.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:416)
at
o.a.c.i.e.DefaultReactiveExecutor$Worker.doRun(DefaultReactiveExecutor.java:199)
at
o.a.c.i.e.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:189)
at
o.a.c.i.e.DefaultReactiveExecutor$Worker.tryExecuteReactiveWork(DefaultReactiveExecutor.java:166)
at
o.a.c.i.e.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
at
o.a.c.i.e.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
at o.a.c.p.Pipeline.process(Pipeline.java:163) at
o.a.c.i.e.CamelInternalProcessor.processNonTransacted(CamelInternalProcessor.java:346)
at o.a.c.i.e.CamelInternalProcessor.process(CamelInternalProcessor.java:322)
at
o.a.c.i.e.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:82)
at o.a.c.s.AsyncProcessorSupport.process(AsyncProcessorSupport.java:32) at
o.a.c.h.c.CamelServlet.doExecute(CamelServlet.java:313) at
o.a.c.h.c.CamelServlet.doService(CamelServlet.java:235) at
o.a.c.h.c.CamelServlet.handleService(CamelServlet.java:111) at
o.a.c.h.c.CamelServlet.service(CamelServlet.java:97) at
j.s.h.HttpServlet.service(HttpServlet.java:614) ... 5 frames excluded at
k.s.s.s.c.SagaContextFilter.doFilterInternal(SagaContextFilter.java:52) ... 4
frames excluded at
o.s.s.w.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
at
o.s.s.w.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:479)
at
o.s.s.w.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:340)
at
o.s.s.w.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:82)
... 2 frames excluded at
o.s.s.w.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240)
... 110 frames truncated{code}
{color:#000000}After finalizing the saga, the Oracle LRA-Coordinator is calling
the 'onComplete' for all participants and the service.{color}
{code:java}
PUT
/camel/complete?Camel-Saga-Compensate=direct%3A%2F%2Fsaga1_participant1_compensate&Camel-Saga-Complete=direct%3A%2F%2Fsaga1_participant1_complete{code}
{color:#000000}Within
o.a.c.s.l.LRASagaRoutes.verifyRequest(LRASagaRoutes.java:107) the extracted
query param 'Camel-Saga-Compensate' is still url encoded:{color}
{code:java}
direct%3A%2F%2Fsaga1_sagaService_complete{code}
{color:#000000}Therefore the check within LRASagaRoutes.verifyRequest fails,
because the valid (indexed) uri is{color}
{code:java}
direct://saga1_sagaService_complete{code}
{color:#000000}The problem can completely solved by CAMEL-21197. In the
meantime in will provide a suggestion for an workaround.{color}
{color:#000000}best regards{color}
{color:#000000}Dirk{color}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)