eventuate-tram / eventuate-tram-sagas-examples-customers-and-orders

Spring Boot/JPA microservices that use an orchestration-based saga to maintain data consistency
Other
520 stars 236 forks source link

Failure when compensating when running Sagas #46

Open BenNeighbour opened 3 years ago

BenNeighbour commented 3 years ago

Hi all, I have previously had my sagas working. I changed it so that instead of calling a method in the same class like this:

.invokeLocal(this::saveSomething)
.withCompensation(this::deleteSomething)

I am calling a method in another service like this:

.invokeLocal(somethingService::saveSomething)
.withCompensation(sagaData -> somethingService.deleteSomething(sagaData.getSomething()))

Here is the full saga definition:

step()
.invokeLocal(somethingEngine::saveSomething)
.withCompensation(sagaData -> somethingEngine.deleteSomething(sagaData.getSomething()))
.step()
.invokeLocal(somethingEngine::createSomethingParticipantRelation)
.withCompensation(sagaData -> participantIdDao.delete(sagaData.getOwnerIdObject()))
.step()
.invokeParticipant(somethingService::linkOwnerToSomething)
.onReply(
        ParticipantNotFound.class,
        (sagaData, participantNotFound) -> sagaData.getSomething())
.onReply(
        LinkParticipantToSomethingFailure.class,
                (sagaData, linkFailure) -> sagaData.getSomething())
.build();

here is the stacktrace when doing the saga

java.lang.UnsupportedOperationException: Failure when compensating
    at io.eventuate.tram.sagas.simpledsl.SimpleSagaDefinition.handleReply(SimpleSagaDefinition.java:50) ~[eventuate-tram-sagas-orchestration-simple-dsl-0.13.0.RELEASE.jar!/:na]
    at io.eventuate.tram.sagas.orchestration.SagaManagerImpl.processActions(SagaManagerImpl.java:201) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
    at io.eventuate.tram.sagas.orchestration.SagaManagerImpl.handleReply(SagaManagerImpl.java:189) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
    at io.eventuate.tram.sagas.orchestration.SagaManagerImpl.handleMessage(SagaManagerImpl.java:155) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.DecoratedMessageHandlerFactory.lambda$decorate$0(DecoratedMessageHandlerFactory.java:33) ~[eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:25) [eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:10) [eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) [eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.lambda$accept$0(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.lambda$doWithMessage$0(SqlTableBasedDuplicateMessageDetector.java:52) ~[eventuate-tram-consumer-jdbc-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.lambda$executeInTransaction$0(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.9.0.RELEASE.jar!/:na]
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.executeInTransaction(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.9.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.doWithMessage(SqlTableBasedDuplicateMessageDetector.java:50) ~[eventuate-tram-consumer-jdbc-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:3) ~[eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) [eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator.accept(OptimisticLockingDecorator.java:20) ~[eventuate-tram-spring-optimistic-locking-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator.accept(OptimisticLockingDecorator.java:12) ~[eventuate-tram-spring-optimistic-locking-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator$$FastClassBySpringCGLIB$$be528231.invoke(<generated>) ~[eventuate-tram-spring-optimistic-locking-0.24.0.RELEASE.jar!/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) ~[spring-tx-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
    at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator$$EnhancerBySpringCGLIB$$d0b3557f.accept(<generated>) ~[eventuate-tram-spring-optimistic-locking-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) [eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:24) ~[eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) [eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]
    at io.eventuate.tram.consumer.common.MessageConsumerImpl.lambda$subscribe$0(MessageConsumerImpl.java:39) ~[eventuate-tram-consumer-common-0.24.0.RELEASE.jar!/:na]

Any help would be much appreciated - I bet I'm doing something obvious wrong!

Ben