Hello community
I was wondering if there is a way to retain the exchange data from the
point of failure in a Saga EIP. Find the following route
I have simulated an error right after parsing data from the create-order
api. I need to use the same in compensation flow to undo the order
creation.
Logs show that the value of header orderId never trickled down to
compensation flow.
from("jetty:http://0.0.0.0:8081/testtxn?httpMethodRestrict=GET").streamCaching()
.log("received http trigger")
.saga().compensation("direct:rollback").propagation(SagaPropagation.REQUIRES_NEW)
.log("creating fresh order")
.setBody(constant("{ \"item_code\" : \"XAH504004\",
\"item_qty\" : 10 }"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.setHeader(Exchange.HTTP_URI,
constant("http://localhost:8000/orders"))
.to("http:dummyhost")
.log("order api response ${body}")
.setHeader("orderId", jsonpath("$.businessObject.order_id"))
.throwException(new Exception("This is a simulated
error")) // simulating a failure
.end();
from("direct:rollback")
.log("saga transaction failed. deleting order ${headers.orderId}")
.setHeader(Exchange.HTTP_URI,
simple("http://localhost:8000/orders/${headers.orderId}"))
.setHeader(Exchange.HTTP_METHOD, constant("DELETE"))
.to("http:dummyhost")
.log("compensation call response ${body}")
.end();
Logs
====
2020-09-08 15:35:55.832 INFO 80448 --- [nio-8000-exec-2]
o.s.web.servlet.DispatcherServlet : Completed initialization in
11 ms
2020-09-08 15:35:57.054 INFO 80448 --- [ qtp18025156-26] route1
: api response
{"message":"success","businessObject":{"order_id":"43657a09-5c32-4303-9b14-73ab03e4e086","item_code":"XAH504004","item_qty":10}}
2020-09-08 15:35:57.065 ERROR 80448 --- [ qtp18025156-26]
o.a.camel.processor.DefaultErrorHandler : Failed delivery for
(MessageId: ID-5CG7324CR4-1599593718571-0-4 on ExchangeId:
ID-5CG7324CR4-1599593718571-0-1). Exhausted after delivery attempt: 1
caught: java.lang.Exception: This is a simulated error
Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor
Elapsed (ms)
[route1 ] [route1 ]
[jetty:http://0.0.0.0:8081/testtxn?httpMethodRestrict=GET
] [ 1373]
[route1 ] [log1 ] [log
] [ 3]
[route1 ] [output1 ]
[saga[compensation:direct:rollback,propagation:REQUIRES_NEW]
] [ 0]
[route1 ] [log2 ] [log
] [ 0]
[route1 ] [setBody1 ] [setBody[constant{{
"item_code" : "XAH504004", "item_qty" : 10 }}] ] [
0]
[route1 ] [setHeader1 ] [setHeader[Content-Type]
] [ 0]
[route1 ] [setHeader2 ] [setHeader[CamelHttpMethod]
] [ 0]
[route1 ] [setHeader3 ] [setHeader[CamelHttpUri]
] [ 0]
[route1 ] [to1 ] [http:dummyhost
] [ 1354]
[route1 ] [log3 ] [log
] [ 0]
[route1 ] [setHeader4 ] [setHeader[orderId]
] [ 6]
[route1 ] [throwException1 ]
[throwException[java.lang.Exception]
] [ 0]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
java.lang.Exception: This is a simulated error
at
com.reji.poc.cluster.camelclustering.routes.SimpleJdbcDBRoute.configure(SimpleJdbcDBRoute.java:32)
~[classes/:na]
at
org.apache.camel.builder.RouteBuilder.checkInitialized(RouteBuilder.java:465)
~[camel-core-2.25.1.jar:2.25.1]
at
org.apache.camel.builder.RouteBuilder.configureRoutes(RouteBuilder.java:403)
~[camel-core-2.25.1.jar:2.25.1]
at
org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:384)
~[camel-core-2.25.1.jar:2.25.1]
at
org.apache.camel.impl.DefaultCamelContext$3.call(DefaultCamelContext.java:1023)
~[camel-core-2.25.1.jar:2.25.1]
at
org.apache.camel.impl.DefaultCamelContext$3.call(DefaultCamelContext.java:1020)
~[camel-core-2.25.1.jar:2.25.1]
at
org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3266)
~[camel-core-2.25.1.jar:2.25.1]
at
org.apache.camel.impl.DefaultCamelContext.addRoutes(DefaultCamelContext.java:1020)
~[camel-core-2.25.1.jar:2.25.1]
at
org.apache.camel.spring.boot.RoutesCollector.onApplicationEvent(RoutesCollector.java:150)
~[camel-spring-boot-2.25.1.jar:2.25.1]
at
org.apache.camel.spring.boot.RoutesCollector.onApplicationEvent(RoutesCollector.java:57)
~[camel-spring-boot-2.25.1.jar:2.25.1]
at
org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
~[spring-context-5.1.17.RELEASE.jar:5.1.17.RELEASE]
at
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
~[spring-context-5.1.17.RELEASE.jar:5.1.17.RELEASE]
at
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
~[spring-context-5.1.17.RELEASE.jar:5.1.17.RELEASE]
at
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)
~[spring-context-5.1.17.RELEASE.jar:5.1.17.RELEASE]
at
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)
~[spring-context-5.1.17.RELEASE.jar:5.1.17.RELEASE]
at
org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897)
~[spring-context-5.1.17.RELEASE.jar:5.1.17.RELEASE]
at
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162)
~[spring-boot-2.1.16.RELEASE.jar:2.1.16.RELEASE]
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)
~[spring-context-5.1.17.RELEASE.jar:5.1.17.RELEASE]
at
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
~[spring-boot-2.1.16.RELEASE.jar:2.1.16.RELEASE]
at
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
~[spring-boot-2.1.16.RELEASE.jar:2.1.16.RELEASE]
at
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
~[spring-boot-2.1.16.RELEASE.jar:2.1.16.RELEASE]
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
~[spring-boot-2.1.16.RELEASE.jar:2.1.16.RELEASE]
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
~[spring-boot-2.1.16.RELEASE.jar:2.1.16.RELEASE]
at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
~[spring-boot-2.1.16.RELEASE.jar:2.1.16.RELEASE]
at
com.reji.poc.cluster.camelclustering.CamelApplication.main(CamelApplication.java:13)
~[classes/:na]
2020-09-08 15:35:57.084 INFO 80448 --- [hread #1 - saga] route2
: saga transaction failed. deleting order