microservices-patterns / ftgo-application

Example code for the book Microservice patterns
Other
3.35k stars 1.29k forks source link

Revise still breaks Saga and order creation - still not fixed #116

Open asn25 opened 3 years ago

asn25 commented 3 years ago

Hi,

I checked how sagas work after commit "Fixes #114 - message handlers should not use @Transactional". Problem with JPAException (transaction marked as rollback only) seems to be solved. But problem that any Exception from Aggregate level breaks Sagas and the system still persists.

1) Start system under docker 2) run batch that creates consumer, restaurant and order (order is created OK in APPROVED state) 3) run revise command: curl -s -X POST "http://${DOCKER_HOST_IP}:8082/orders/1/revise" -H "Content-Type: application/json" -d '{"revisedLineItemQuantities": {"1": 14}}'

After that I see a number of exceptions in order-service console (below) starting with NullPointerException.

Now system is in broken state, so Sagas are not working and all orders are created in APPROVAL_PENDING state. Only full restart helps. So it's the same outcome as in issue #70 and in number other Saga-related issues.

This should not happen, even if curl command is not valid, not correctly spelled, not with all parameters and so on. Since system is gone to invalid state till forever and we should do full restart.

My local solution is - to close ALL CommandHandlers methods with try-catch catching ALL Exceptions (and returning "withFailure()" to the Saga in case of any Exception, as described in #113, clause 2). And it works fine, Sagas are working always and new orders are created always in APPROVED state, even if sometimes in some Sagas there was an Exception thrown from Aggregate level.

In current state, almost any Exception (expected or unexpected) from Aggregate level will break Sagas and system till forever (till full restart under docker).

===========================

2020-08-30 16:21:13.854 DEBUG [ftgo-order-service,9f21c9bafa7a4fde,c8a05a276fb3b766,true] 6 --- [pool-3-thread-1] org.hibernate.SQL : select lineitems0_.order_id as order_id1_00, lineitems0_.menu_item_id as menu_ite2_00, lineitems0_.name as name3_00, lineitems0_.price as price4_00, lineitems0_.quantity as quantity5_00 from order_lineitems lineitems0 where lineitems0_.order_id=? 2020-08-30 16:21:13.858 ERROR [ftgo-order-service,9f21c9bafa7a4fde,c8a05a276fb3b766,true] 6 --- [pool-3-thread-1] i.e.t.s.p.SagaCommandDispatcher : Generated error orderService io.eventuate.tram.messaging.common.MessageImpl@6467d7b4[payload={"orderId":1,"revision":{}},headers={commandsaga id=00000174402c37be-0242ac1600070000, DATE=Sun, 30 Aug 2020 16:21:13 GMT, command_type=net.chrisrichardson.ftgo.orderservice.sagaparticipants.BeginReviseOrderCommand, command_reply_to=net.chrisrichardson.ftgo.orderservice.sagas.reviseorder.ReviseOrderSaga-reply, DESTINATION=orderService, command_sag a_type=net.chrisrichardson.ftgo.orderservice.sagas.reviseorder.ReviseOrderSaga, command__destination=orderService, ID=00000174402c37cb-0242ac1600070000, X-B3-TraceId=9f21c9bafa7a4fde, X-B3-SpanId=c8a05a276fb3b766, X-B3-ParentSpanId=80a60d29918231a6, X-B3-Sampled=1}] java.lang.NullPointerException 2020-08-30 16:21:13.859 ERROR [ftgo-order-service,9f21c9bafa7a4fde,c8a05a276fb3b766,true] 6 --- [pool-3-thread-1] i.e.t.s.p.SagaCommandDispatcher : Generated error

java.lang.NullPointerException: null at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.changeToOrderTotal(OrderLineItems.java:43) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.lineItemQuantityChange(OrderLineItems.java:71) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.Order.revise(Order.java:149) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.lambda$beginReviseOrder$11(OrderService.java:163) ~[classes!/:na] at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_252] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.beginReviseOrder(OrderService.java:162) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$FastClassBySpringCGLIB$$f0abbe15.invoke() ~[classes!/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685) ~[spring-aop-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$EnhancerBySpringCGLIB$$61578858.beginReviseOrder() ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlers.beginReviseOrder(OrderCommandHandlers.java:86) ~[classes!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandlersBuilder.lambda$onMessage$1(SagaCommandHandlersBuilder.java:50) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandler.lambda$new$0(SagaCommandHandler.java:25) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.lambda$new$0(CommandHandler.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.invokeMethod(CommandHandler.java:62) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.invoke(CommandDispatcher.java:93) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.invoke(SagaCommandDispatcher.java:78) [eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:76) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) [eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DecoratedMessageHandlerFactory.lambda$decorate$0(DecoratedMessageHandlerFactory.java:33) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:25) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.lambda$accept$0(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.lambda$doWithMessage$0(SqlTableBasedDuplicateMessageDetector.java:52) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.lambda$executeInTransaction$0(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.executeInTransaction(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.doWithMessage(SqlTableBasedDuplicateMessageDetector.java:50) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:3) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:24) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageConsumerImpl.lambda$subscribe$0(MessageConsumerImpl.java:39) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.25.1.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:74) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:44) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_252] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_252] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_252]

2020-08-30 16:21:13.860 ERROR [ftgo-order-service,9f21c9bafa7a4fde,c8a05a276fb3b766,true] 6 --- [pool-3-thread-1] i.e.t.c.c.DecoratedMessageHandlerFactory : Got exception orderService 00000174402c37cb-0242ac1600070000 2020-08-30 16:21:13.861 ERROR [ftgo-order-service,9f21c9bafa7a4fde,c8a05a276fb3b766,true] 6 --- [pool-3-thread-1] i.e.t.c.c.DecoratedMessageHandlerFactory : Got exception

java.lang.UnsupportedOperationException: A command handler for command of type net.chrisrichardson.ftgo.orderservice.sagaparticipants.BeginReviseOrderCommand on channel orderService threw an exception at io.eventuate.tram.commands.consumer.CommandHandlers.findExceptionHandler(CommandHandlers.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.handleException(CommandDispatcher.java:141) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:81) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DecoratedMessageHandlerFactory.lambda$decorate$0(DecoratedMessageHandlerFactory.java:33) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:25) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.lambda$accept$0(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.lambda$doWithMessage$0(SqlTableBasedDuplicateMessageDetector.java:52) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.lambda$executeInTransaction$0(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.executeInTransaction(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.doWithMessage(SqlTableBasedDuplicateMessageDetector.java:50) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:3) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:24) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageConsumerImpl.lambda$subscribe$0(MessageConsumerImpl.java:39) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.25.1.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:74) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:44) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_252] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_252] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_252] Caused by: java.lang.NullPointerException: null at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.changeToOrderTotal(OrderLineItems.java:43) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.lineItemQuantityChange(OrderLineItems.java:71) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.Order.revise(Order.java:149) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.lambda$beginReviseOrder$11(OrderService.java:163) ~[classes!/:na] at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_252] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.beginReviseOrder(OrderService.java:162) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$FastClassBySpringCGLIB$$f0abbe15.invoke() ~[classes!/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685) ~[spring-aop-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$EnhancerBySpringCGLIB$$61578858.beginReviseOrder() ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlers.beginReviseOrder(OrderCommandHandlers.java:86) ~[classes!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandlersBuilder.lambda$onMessage$1(SagaCommandHandlersBuilder.java:50) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandler.lambda$new$0(SagaCommandHandler.java:25) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.lambda$new$0(CommandHandler.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.invokeMethod(CommandHandler.java:62) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.invoke(CommandDispatcher.java:93) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.invoke(SagaCommandDispatcher.java:78) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:76) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] ... 25 common frames omitted

2020-08-30 16:21:13.868 ERROR [ftgo-order-service,9f21c9bafa7a4fde,c8a05a276fb3b766,true] 6 --- [pool-3-thread-1] .c.PrePostHandlerMessageHandlerDecorator : decoration failed

java.lang.UnsupportedOperationException: A command handler for command of type net.chrisrichardson.ftgo.orderservice.sagaparticipants.BeginReviseOrderCommand on channel orderService threw an exception at io.eventuate.tram.commands.consumer.CommandHandlers.findExceptionHandler(CommandHandlers.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.handleException(CommandDispatcher.java:141) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:81) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DecoratedMessageHandlerFactory.lambda$decorate$0(DecoratedMessageHandlerFactory.java:33) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:25) [eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:10) [eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) [eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.lambda$accept$0(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.lambda$doWithMessage$0(SqlTableBasedDuplicateMessageDetector.java:52) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.lambda$executeInTransaction$0(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.executeInTransaction(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.doWithMessage(SqlTableBasedDuplicateMessageDetector.java:50) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:3) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) [eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:24) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) [eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageConsumerImpl.lambda$subscribe$0(MessageConsumerImpl.java:39) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.25.1.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:74) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:44) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_252] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_252] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_252] Caused by: java.lang.NullPointerException: null at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.changeToOrderTotal(OrderLineItems.java:43) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.lineItemQuantityChange(OrderLineItems.java:71) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.Order.revise(Order.java:149) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.lambda$beginReviseOrder$11(OrderService.java:163) ~[classes!/:na] at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_252] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.beginReviseOrder(OrderService.java:162) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$FastClassBySpringCGLIB$$f0abbe15.invoke() ~[classes!/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685) ~[spring-aop-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$EnhancerBySpringCGLIB$$61578858.beginReviseOrder() ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlers.beginReviseOrder(OrderCommandHandlers.java:86) ~[classes!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandlersBuilder.lambda$onMessage$1(SagaCommandHandlersBuilder.java:50) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandler.lambda$new$0(SagaCommandHandler.java:25) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.lambda$new$0(CommandHandler.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.invokeMethod(CommandHandler.java:62) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.invoke(CommandDispatcher.java:93) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.invoke(SagaCommandDispatcher.java:78) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:76) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] ... 25 common frames omitted

2020-08-30 16:21:13.891 ERROR [ftgo-order-service,,,] 6 --- [pool-3-thread-1] i.e.m.k.b.c.KafkaMessageProcessor : Got exception:

java.lang.UnsupportedOperationException: A command handler for command of type net.chrisrichardson.ftgo.orderservice.sagaparticipants.BeginReviseOrderCommand on channel orderService threw an exception at io.eventuate.tram.commands.consumer.CommandHandlers.findExceptionHandler(CommandHandlers.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.handleException(CommandDispatcher.java:141) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:81) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DecoratedMessageHandlerFactory.lambda$decorate$0(DecoratedMessageHandlerFactory.java:33) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:25) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.lambda$accept$0(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.lambda$doWithMessage$0(SqlTableBasedDuplicateMessageDetector.java:52) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.lambda$executeInTransaction$0(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.executeInTransaction(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.doWithMessage(SqlTableBasedDuplicateMessageDetector.java:50) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:3) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:24) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageConsumerImpl.lambda$subscribe$0(MessageConsumerImpl.java:39) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.25.1.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:74) [eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:44) [eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_252] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_252] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_252] Caused by: java.lang.NullPointerException: null at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.changeToOrderTotal(OrderLineItems.java:43) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.lineItemQuantityChange(OrderLineItems.java:71) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.Order.revise(Order.java:149) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.lambda$beginReviseOrder$11(OrderService.java:163) ~[classes!/:na] at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_252] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.beginReviseOrder(OrderService.java:162) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$FastClassBySpringCGLIB$$f0abbe15.invoke() ~[classes!/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685) ~[spring-aop-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$EnhancerBySpringCGLIB$$61578858.beginReviseOrder() ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlers.beginReviseOrder(OrderCommandHandlers.java:86) ~[classes!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandlersBuilder.lambda$onMessage$1(SagaCommandHandlersBuilder.java:50) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandler.lambda$new$0(SagaCommandHandler.java:25) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.lambda$new$0(CommandHandler.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.invokeMethod(CommandHandler.java:62) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.invoke(CommandDispatcher.java:93) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.invoke(SagaCommandDispatcher.java:78) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:76) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] ... 25 common frames omitted

2020-08-30 16:21:13.895 ERROR [ftgo-order-service,,,] 6 --- [pool-3-thread-1] i.e.m.kafka.consumer.SwimlaneDispatcher : Exception handling message - terminating

java.lang.UnsupportedOperationException: A command handler for command of type net.chrisrichardson.ftgo.orderservice.sagaparticipants.BeginReviseOrderCommand on channel orderService threw an exception at io.eventuate.tram.commands.consumer.CommandHandlers.findExceptionHandler(CommandHandlers.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.handleException(CommandDispatcher.java:141) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:81) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DecoratedMessageHandlerFactory.lambda$decorate$0(DecoratedMessageHandlerFactory.java:33) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:25) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostHandlerMessageHandlerDecorator.accept(PrePostHandlerMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.lambda$accept$0(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.lambda$doWithMessage$0(SqlTableBasedDuplicateMessageDetector.java:52) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.lambda$executeInTransaction$0(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at io.eventuate.common.common.spring.jdbc.EventuateSpringTransactionTemplate.executeInTransaction(EventuateSpringTransactionTemplate.java:18) ~[eventuate-common-common-spring-jdbc-0.10.0.RELEASE.jar!/:na] at io.eventuate.tram.consumer.jdbc.SqlTableBasedDuplicateMessageDetector.doWithMessage(SqlTableBasedDuplicateMessageDetector.java:50) ~[eventuate-tram-consumer-jdbc-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:13) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.DuplicateDetectingMessageHandlerDecorator.accept(DuplicateDetectingMessageHandlerDecorator.java:3) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:24) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.PrePostReceiveMessageHandlerDecorator.accept(PrePostReceiveMessageHandlerDecorator.java:10) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageHandlerDecoratorChainBuilder.lambda$buildChain$0(MessageHandlerDecoratorChainBuilder.java:38) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.common.MessageConsumerImpl.lambda$subscribe$0(MessageConsumerImpl.java:39) ~[eventuate-tram-consumer-common-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.25.1.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:74) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:44) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.10.0.RELEASE.jar!/:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_252] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_252] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_252] Caused by: java.lang.NullPointerException: null at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.changeToOrderTotal(OrderLineItems.java:43) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderLineItems.lineItemQuantityChange(OrderLineItems.java:71) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.Order.revise(Order.java:149) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.lambda$beginReviseOrder$11(OrderService.java:163) ~[classes!/:na] at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_252] at net.chrisrichardson.ftgo.orderservice.domain.OrderService.beginReviseOrder(OrderService.java:162) ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$FastClassBySpringCGLIB$$f0abbe15.invoke() ~[classes!/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685) ~[spring-aop-5.2.1.RELEASE.jar!/:5.2.1.RELEASE] at net.chrisrichardson.ftgo.orderservice.domain.OrderService$$EnhancerBySpringCGLIB$$61578858.beginReviseOrder() ~[classes!/:na] at net.chrisrichardson.ftgo.orderservice.service.OrderCommandHandlers.beginReviseOrder(OrderCommandHandlers.java:86) ~[classes!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandlersBuilder.lambda$onMessage$1(SagaCommandHandlersBuilder.java:50) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandHandler.lambda$new$0(SagaCommandHandler.java:25) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.lambda$new$0(CommandHandler.java:27) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandHandler.invokeMethod(CommandHandler.java:62) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.invoke(CommandDispatcher.java:93) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.invoke(SagaCommandDispatcher.java:78) ~[eventuate-tram-sagas-participant-0.14.0.RELEASE.jar!/:na] at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:76) ~[eventuate-tram-commands-0.25.1.RELEASE.jar!/:na] ... 25 common frames omitted

2020-08-30 16:21:13.941 INFO [ftgo-order-service,,,] 6 --- [er-orderService] o.a.k.c.c.internals.AbstractCoordinator : [Consumer clientId=consumer-1, groupId=orderService] Member consumer-1-2f17d785-8d05-4a7f-911b-1cc86e17a283 sending LeaveGroup request to coordinator kafka:29092 (id: 2147482646 r ack: null) 2020-08-30 16:21:16.845 INFO [ftgo-order-service,,,] 6 --- [erSaga-consumer] o.a.k.c.c.internals.AbstractCoordinator : [Consumer clientId=consumer-4, groupId=net.chrisrichardson.ftgo.orderservice.sagas.reviseorder.ReviseOrderSaga-consumer] Successfully joined group with generation 1 2020-08-30 16:21:16.846 INFO [ftgo-order-service,,,] 6 --- [erSaga-consumer] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-4, groupId=net.chrisrichardson.ftgo.orderservice.sagas.reviseorder.ReviseOrderSaga-consumer] Setting newly assigned partitions: net.chrisrichardson.ftg o.orderservice.sagas.reviseorder.ReviseOrderSaga-reply-0 2020-08-30 16:21:16.851 INFO [ftgo-order-service,,,] 6 --- [erSaga-consumer] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-4, groupId=net.chrisrichardson.ftgo.orderservice.sagas.reviseorder.ReviseOrderSaga-consumer] Found no committed offset for partition net.chrisrichardso n.ftgo.orderservice.sagas.reviseorder.ReviseOrderSaga-reply-0 2020-08-30 16:21:16.857 INFO [ftgo-order-service,,,] 6 --- [erSaga-consumer] o.a.k.c.c.internals.SubscriptionState : [Consumer clientId=consumer-4, groupId=net.chrisrichardson.ftgo.orderservice.sagas.reviseorder.ReviseOrderSaga-consumer] Resetting offset for partition net.chrisrichardson.ftgo.or derservice.sagas.reviseorder.ReviseOrderSaga-reply-0 to offset 0.

cer commented 3 years ago

Presumably, what you are trying to say is that

  1. an invalid HTTP revise request causes the Order Service's saga command handler to throw a NullPointerException.
  2. The unhandled exception causes the Order Service to stop processing messages.

A few points

asn25 commented 3 years ago

Thanks for your reply. Yes, I meant that application should have some level of "protection from a fool" or validation.

I understand points about necessity also to catch developer's bugs and not to hide problems. Sound reasonable.

But in contrary, on my opinion, it's not good when invalid HTTP request leads to necessity to restart service (or pack of services). Tester/developer should be able to identify (somehow) that system became in invalid state from now. And the one has to identify that restart is needed as the only solution (which is not obvious) and in what volume this restart should be done (one service or full landscape? not obvious)... Application might be too brittle to test/work with.

BTW, it's not clear, why this revise request was behaving as invalid. I'm running it perfectly fine on one of previous versions of application (that was before adding of Delivery service).

asn25 commented 3 years ago

And in the case of necessity to do such restart, would be good to have described procedure (when restart, why restart, in what volume restart).

But not-restarting solution would be better, of course.

asn25 commented 3 years ago

Also, I would like to add, since application doesn't have UI yet, so the only possibility to work with it (as for me) is to intensively use curl (swagger UI is not an option, it's too slow and can't be combined in batches). So as for working with curl, it's really very inconvenient when invalid curl breaks the system and requires restart... Would be great to make some validation against it.

cer commented 3 years ago

BTW, it's not clear, why this revise request was behaving as invalid.

There were some breaking improvements/changes to the REST API including revise()