You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Dirk Fiedler (Jira)" <ji...@apache.org> on 2024/09/13 13:54:00 UTC
[jira] [Commented] (CAMEL-21216) Apache Camel LRA does not work with Oracle MicroTX LRA coordinator
[ https://issues.apache.org/jira/browse/CAMEL-21216?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17881582#comment-17881582 ]
Dirk Fiedler commented on CAMEL-21216:
--------------------------------------
i have created a pull request with my change: [https://github.com/apache/camel/pull/15558]
> 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
> Priority: Minor
>
> {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)