GithubHelp home page GithubHelp logo

eventuate-tram / eventuate-tram-sagas-examples-customers-and-orders Goto Github PK

View Code? Open in Web Editor NEW
516.0 516.0 239.0 1.88 MB

Spring Boot/JPA microservices that use an orchestration-based saga to maintain data consistency

License: Other

Shell 3.75% Java 89.32% Dockerfile 0.55% Groovy 6.38%

eventuate-tram-sagas-examples-customers-and-orders's Introduction

An Eventuate project

logo

This project is part of Eventuate, which is a microservices collaboration platform.

Eventuate Tram (Transactional Messaging) platform

Spring/Micronaut

eventuate tram bom

Quarkus

eventuate tram quarkus bom

Eventuate Tram is a platform that solves the distributed data management problems inherent in a microservice architecture.

It is described in more detail in my book Microservice Patterns and the getting started guide.

Key benefits of Eventuate Tram

Maintain data consistency using sagas

Implement commands that update data in multiple microservices by using Sagas, which are sequences of local transactions coordinated using messages

Implement queries using CQRS

Implement queries that retrieve data from multiple services by using CQRS views, which are easily queryable replicas maintained using events

Communicate using transactional messaging

Reliably send and receive messages and events as part of a database transaction by using the Transactional Outbox pattern

How it works

Eventuate Tram provides several messaging abstractions:

  • messaging - send and receive messages over named channels

  • events - publish domain events and subscribe to domain events

  • commands - asynchronously send a command to a service and receive a reply

Eventuate Tram messaging implements the Transactional Outbox pattern. An message producer inserts events into an OUTBOX table as part of the ACID transaction that updates data, such as JPA entities. A separate message relay (a.k.a. Eventuate CDC service) publishes messages to the message broker.

ReliablePublication

The Eventuate CDC service works in one of two ways:

Supported technologies

Languages:

Databases:

Message brokers:

  • Apache Kafka

  • ActiveMQ

  • RabbitMQ

  • Redis Streams

Getting started

Please see the getting started guide.

Example applications

There are numerous example applications:

Got questions?

Don’t hesitate to create an issue or see

Need support?

Take a look at the available paid support options.

Transactional messaging

Send a message using MessageProducer:

public interface MessageProducer {
  void send(String destination, Message message);
}

Receive messages using:

public interface MessageConsumer {
  void subscribe(String subscriberId, Set<String> channels, MessageHandler handler);
}

See this example of transactional messaging.

Transactional domain events

The domain event package builds on the core APIs.

Publish domain events using the DomainEventPublisher interface:

public interface DomainEventPublisher {

  void publish(String aggregateType, Object aggregateId, List<DomainEvent> domainEvents);
  ...

Subscribe to domain events using a DomainEventDispatcher:

public class DomainEventDispatcher {
    public DomainEventDispatcher(String eventDispatcherId,
                DomainEventHandlers eventHandlers,
                ...) {
...
}

Handle the events using DomainEventHandlers:

public class RestaurantOrderEventConsumer {

  public DomainEventHandlers domainEventHandlers() {
    return DomainEventHandlersBuilder
            .forAggregateType("net.chrisrichardson.ftgo.restaurantservice.Restaurant")
            .onEvent(RestaurantMenuRevised.class, this::reviseMenu)
            .build();
  }

  public void reviseMenu(DomainEventEnvelope<RestaurantMenuRevised> de) {

See this example of transaction events.

Transactional commands

Transaction commands are implemented using transactional messaging.

Send a command using a CommandProducer:

public interface CommandProducer {
  String send(String channel, Command command, String replyTo, Map<String, String> headers);
  ...
}

Subscribe to commands using a CommandDispatcher:

public class CommandDispatcher {

  public CommandDispatcher(String commandDispatcherId,
           CommandHandlers commandHandlers) {
  ...
}

Handle commands and send a reply using CommandHandlers:

public class OrderCommandHandlers {


  public CommandHandlers commandHandlers() {
    return CommandHandlersBuilder
          .fromChannel("orderService")
          .onMessage(ApproveOrderCommand.class, this::approveOrder)
          ...
          .build();
  }

  public Message approveOrder(CommandMessage<ApproveOrderCommand> cm) {
    ApproveOrderCommand command = cm.getCommand();
    ...
  }

See this example of transactional commands.

Maven/Gradle artifacts

The artifacts are in JCenter. The latest version is:

RC

download

Release

download

There are the following API artifacts:

  • io.eventuate.tram.core:eventuate-tram-messaging:$eventuateTramVersion - core messaging APIs

  • io.eventuate.tram.core:eventuate-tram-events:$eventuateTramVersion - domain event API

  • io.eventuate.tram.core:eventuate-tram-commands:$eventuateTramVersion - commands/reply API

There are the following 'implementation' artifacts:

  • io.eventuate.tram.core:eventuate-tram-jdbc-kafka:$eventuateTramVersion - JDBC database and Apache Kafka message broker

  • io.eventuate.tram.core:eventuate-tram-jdbc-activemq:$eventuateTramVersion - JDBC database and Apache ActiveMQ message broker

  • io.eventuate.tram.core:eventuate-tram-jdbc-rabbitmq:$eventuateTramVersion - JDBC database and RabbitMQ message broker

  • io.eventuate.tram.core:eventuate-tram-jdbc-redis:$eventuateTramVersion - JDBC database and Redis Streams

  • io.eventuate.tram.core:eventuate-tram-in-memory:$eventuateTramVersion - In-memory JDBC database and in-memory messaging for testing

Running the CDC service

In addition to a database and message broker, you will need to run the Eventuate Tram CDC service. It reads events inserted into the database and publishes them to the message broker. It is written using Spring Boot. The easiest way to run this service during development is to use Docker Compose. The Eventuate Tram Code Basic examples project has an example docker-compose.yml file.

Contributing

Contributions are welcome.

eventuate-tram-sagas-examples-customers-and-orders's People

Contributors

cer avatar dartartem avatar eventuateio avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eventuate-tram-sagas-examples-customers-and-orders's Issues

Can't get CDC service to start

When running ./gradlew mysqlComposeUp

I get the following messages and the CDC fails to start

Waiting for cdcservice_1 to become healthy (it's starting)
Waiting for cdcservice_1 to become healthy (it's starting)
Waiting for cdcservice_1 to become healthy (it's unhealthy)

Eventuate Tram Saga Orchestration - we are getting Cross Database Reference Issue for Postgresql

Hi @cer @dartartem
While implementing microservices using Eventuate saga orchestrator pattern using postgresql 9.6 database, we are getting below issue

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [select data_type from eventuate.information_schema.columns where table_name = ? and column_name = ?]; SQL state [0A000]; error code [0]; ERROR: cross-database references are not implemented: "eventuate.information_schema.columns"

Meanwhile we have tried in MYSQL 8 database it worked, but we require it in Postgresql DB. Please help us on fixing the issue.

Implement a Swagger UI for the API gateway

It would be great if the API gateway had a Swagger UI, especially for the Order History.
Proposal:

  • Use compile "io.eventuate.util:eventuate-util-swagger-ui:$eventuateUtilVersion"
  • Handcrafted OpenAPI definition file (manually combine Swagger UIs from services)

@dartartem

Is Eventuate CDC going to hog up database storage?

Hi, just a quick question to either @cer or @dartartem (or anyone who happens to know), just to clarify, the database records produced by the Eventuate CDC with JDBC are periodically cleaned up/deleted right - if so, on what basis and how often is the state reset?

Thanks, Ben Neighbour

Can't get CDC service to start (Waiting for cdcservice_1 to become healthy (it's unhealthy))

i try to run mysqlComposeUp but i get this error

Waiting for cdcservice_1 to become healthy (it's starting)
Waiting for cdcservice_1 to become healthy (it's starting)
Waiting for cdcservice_1 to become healthy (it's unhealthy)

and after 15minutes project building stoped with error.|
I did your recommendation
"export DOCKER_HOST_IP: %yourPcIpAddressHERE"
and nothing happened.
please tell us how to resolve that.

Failure when compensating when running Sagas

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

I don't think it's need distributed transaction in this case

It just involved two service,and Customer-Server don't need to excute DQL.It is my understanding that 2 or more database need to execute DQL than we need distributed transaction.
Furthermore,If I need compensate and action in every step,and there are over 2 step.What am I supposed to write SagaDefinition like below?

private SagaDefinition<CreateOrderSagaData> sagaDefinition = step() .withCompensation(this::reject) .step() .invokeParticipant(this::reserveCredit) .step() .invokeParticipant(this::approve) .build();

swagger ui is not available for api-gateway

api-gateway has controller that server index.html of swagger-ui:

@RestController
public class SwaggerController {
@GetMapping("/swagger-ui.html")
public Resource getFile() {
return new ClassPathResource("META-INF/swagger-ui/index.html");
}
}

But there is no such file "META-INF/swagger-ui/index.html"

Problem is that META-INF of eventuate-util-swagger-ui is not unpacked in api-gateway jar

Solution is define task to unpack:

bootJar {
    requiresUnpack '**/eventuate-util-swagger-ui-*.jar'
}

Remove redundant CDC configuration properties

export EVENTUATELOCAL_CDC_POLLING_INTERVAL_IN_MILLISECONDS=500
export EVENTUATELOCAL_CDC_MAX_EVENTS_PER_POLLING=1000
export EVENTUATELOCAL_CDC_MAX_ATTEMPTS_FOR_POLLING=100
export EVENTUATELOCAL_CDC_POLLING_RETRY_INTERVAL_IN_MILLISECONDS=500
export SPRING_PROFILES_ACTIVE=EventuatePolling

And here too:

EVENTUATELOCAL_CDC_POLLING_INTERVAL_IN_MILLISECONDS: 500
EVENTUATELOCAL_CDC_MAX_EVENTS_PER_POLLING: 1000
EVENTUATELOCAL_CDC_MAX_ATTEMPTS_FOR_POLLING: 100
EVENTUATELOCAL_CDC_POLLING_RETRY_INTERVAL_IN_MILLISECONDS: 500

Intermittent failure when running CustomersAndOrdersE2ETest after applying migration

CircleCI build

Test:

org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found: "{"timestamp":1654591803477,"status":404,"error":"Not Found","path":"/orders"}"
	at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:113)
	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:168)
	at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
	at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
	at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:819)
	at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:777)
	at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
	at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:437)
	at io.eventuate.examples.tram.sagas.ordersandcustomers.endtoendtests.CustomersAndOrdersE2ETest.shouldRejectBecauseOfUnknownCustomer(CustomersAndOrdersE2ETest.java:82)

API Gateway

2022-06-07 08:49:59.038 DEBUG [api-gateway,845eb61e78b63a87,845eb61e78b63a87] 1 --- [ctor-http-nio-3] o.s.w.s.adapter.HttpWebHandlerAdapter    : [59b7c92b-41] Completed 200 OK
2022-06-07 08:50:03.318 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-42] HTTP POST "/orders"
2022-06-07 08:50:03.488 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : CircuitBreaker 'myCircuitBreaker' succeeded:
2022-06-07 08:50:03.489 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : Event SUCCESS published: 2022-06-07T08:50:03.489019639Z[UTC]: CircuitBreaker 'myCircuitBreaker' recorded a successful call. Elapsed time: 168 ms
2022-06-07 08:50:03.492 DEBUG [api-gateway,,09b50d680ad82cef] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-42] Completed 404 NOT_FOUND
2022-06-07 08:50:03.578 DEBUG [api-gateway,,09b50d680ad82cef] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-43] HTTP POST "/customers"

2022-06-07 08:49:59.037 DEBUG [api-gateway,845eb61e78b63a87,845eb61e78b63a87] 1 --- [ctor-http-nio-3] .s.w.r.r.m.a.ResponseEntityResultHandler : [59b7c92b-41] 0..1 [org.springframework.boot.actuate.health.SystemHealth]
2022-06-07 08:49:59.037 DEBUG [api-gateway,845eb61e78b63a87,845eb61e78b63a87] 1 --- [ctor-http-nio-3] o.s.http.codec.json.Jackson2JsonEncoder  : [59b7c92b-41] Encoding [org.springframework.boot.actuate.health.SystemHealth@5736569d]
2022-06-07 08:49:59.038 DEBUG [api-gateway,845eb61e78b63a87,845eb61e78b63a87] 1 --- [ctor-http-nio-3] o.s.w.s.adapter.HttpWebHandlerAdapter    : [59b7c92b-41] Completed 200 OK
2022-06-07 08:50:03.318 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-42] HTTP POST "/orders"
2022-06-07 08:50:03.488 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : CircuitBreaker 'myCircuitBreaker' succeeded:
2022-06-07 08:50:03.489 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : Event SUCCESS published: 2022-06-07T08:50:03.489019639Z[UTC]: CircuitBreaker 'myCircuitBreaker' recorded a successful call. Elapsed time: 168 ms
2022-06-07 08:50:03.492 DEBUG [api-gateway,,09b50d680ad82cef] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-42] Completed 404 NOT_FOUND
2022-06-07 08:50:03.578 DEBUG [api-gateway,,09b50d680ad82cef] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-43] HTTP POST "/customers"
2022-06-07 08:50:03.816 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : CircuitBreaker 'myCircuitBreaker' succeeded:
2022-06-07 08:50:03.816 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : Event SUCCESS published: 2022-06-07T08:50:03.816483740Z[UTC]: CircuitBreaker 'myCircuitBreaker' recorded a successful call. Elapsed time: 235 ms
2022-06-07 08:50:03.820 DEBUG [api-gateway,,87172a44656aade4] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-43] Completed 404 NOT_FOUND
2022-06-07 08:50:03.830 DEBUG [api-gateway,,87172a44656aade4] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-44] HTTP POST "/customers"
2022-06-07 08:50:03.844 DEBUG [api-gateway,,] 1 --- [/api/v2/spans}}] o.s.w.r.f.client.ExchangeFunctions       : [1454eccb] HTTP POST http://zipkin:9411/api/v2/spans
2022-06-07 08:50:03.856 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-1] o.s.core.codec.ByteArrayEncoder          : [1454eccb] Writing 1779 bytes
2022-06-07 08:50:03.874 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-1] o.s.w.r.f.client.ExchangeFunctions       : [1454eccb] [934a879c-1, L:/172.18.0.7:57792 - R:zipkin/172.18.0.2:9411] Response 202 ACCEPTED
2022-06-07 08:50:03.896 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : CircuitBreaker 'myCircuitBreaker' succeeded:
2022-06-07 08:50:03.897 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : Event SUCCESS published: 2022-06-07T08:50:03.897005972Z[UTC]: CircuitBreaker 'myCircuitBreaker' recorded a successful call. Elapsed time: 64 ms
2022-06-07 08:50:03.899 DEBUG [api-gateway,,fbb17eb2b737f893] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-44] Completed 404 NOT_FOUND
2022-06-07 08:50:03.922 DEBUG [api-gateway,,fbb17eb2b737f893] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-45] HTTP POST "/customers"
2022-06-07 08:50:03.937 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : CircuitBreaker 'myCircuitBreaker' succeeded:
2022-06-07 08:50:03.937 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : Event SUCCESS published: 2022-06-07T08:50:03.937227933Z[UTC]: CircuitBreaker 'myCircuitBreaker' recorded a successful call. Elapsed time: 11 ms
2022-06-07 08:50:03.944 DEBUG [api-gateway,,f2e7eee6a39402ab] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-45] Completed 404 NOT_FOUND
2022-06-07 08:50:03.960 DEBUG [api-gateway,,f2e7eee6a39402ab] 1 --- [ctor-http-nio-4] o.s.w.s.adapter.HttpWebHandlerAdapter    : [bb3b5bd9-46] HTTP GET "/customers/1654591803949/orderhistory"
2022-06-07 08:50:03.964 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] o.s.w.r.f.s.s.RouterFunctionMapping      : [bb3b5bd9-46] Mapped to io.eventuate.examples.tram.sagas.ordersandcustomers.apigateway.customers.CustomerConfiguration$$Lambda$729/0x000000080111ee68@5aea5377
2022-06-07 08:50:03.968 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] o.s.w.r.f.client.ExchangeFunctions       : [64bb7906] HTTP GET http://customer-service:8080/customers/1654591803949
2022-06-07 08:50:03.971 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] o.s.w.r.f.client.ExchangeFunctions       : [6ab8b770] HTTP GET http://order-service:8080/orders/customer/1654591803949
2022-06-07 08:50:04.022 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] o.s.w.r.f.client.ExchangeFunctions       : [64bb7906] [fdc64cb6-1, L:/172.18.0.7:41576 - R:customer-service/172.18.0.9:8080] Response 404 NOT_FOUND
2022-06-07 08:50:04.022 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : CircuitBreaker 'MY_CIRCUIT_BREAKER' succeeded:
2022-06-07 08:50:04.022 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : Event SUCCESS published: 2022-06-07T08:50:04.022522655Z[UTC]: CircuitBreaker 'MY_CIRCUIT_BREAKER' recorded a successful call. Elapsed time: 55 ms
2022-06-07 08:50:04.036 DEBUG [api-gateway,,] 1 --- [ctor-http-nio-4] o.s.w.r.f.client.ExchangeFunctions       : [6ab8b770] [d52f6294-1, L:/172.18.0.7:44738 - R:order-service/172.18.0.8:8080] Response 404 NOT_FOUND
2022-06-07 08:50:04.051 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] o.s.w.r.f.client.ExchangeFunctions       : [6ab8b770] Cancel signal (to close connection)
2022-06-07 08:50:04.051 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] o.s.h.c.r.ReactorClientHttpResponse      : [d52f6294-1, L:/172.18.0.7:44738 - R:order-service/172.18.0.8:8080]Releasing body, not yet subscribed.
2022-06-07 08:50:04.082 DEBUG [api-gateway,a2b559bf7d349d6e,a2b559bf7d349d6e] 1 --- [ctor-http-nio-4] i.g.r.c.i.CircuitBreakerStateMachine     : CircuitBreaker 'MY_CIRCUIT_BREAKER' recorded an exception as failure:

io.eventuate.examples.tram.sagas.ordersandcustomers.apigateway.proxies.UnknownProxyException: Unknown: 404 NOT_FOUND
	at io.eventuate.examples.tram.sagas.ordersandcustomers.apigateway.proxies.OrderServiceProxy.lambda$findOrdersByCustomerId$0(OrderServiceProxy.java:43) ~[classes!/:na]
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoFlatMap] :
	reactor.core.publisher.Mono.flatMap
	io.eventuate.examples.tram.sagas.ordersandcustomers.apigateway.proxies.OrderServiceProxy.findOrdersByCustomerId(OrderServiceProxy.java:38)
Error has been observed at the following site(s):
	*____________Mono.flatMap ⇢ at io.eventuate.examples.tram.sagas.ordersandcustomers.apigateway.proxies.OrderServiceProxy.findOrdersByCustomerId(OrderServiceProxy.java:38)
	|_           Mono.timeout ⇢ at io.github.resilience4j.reactor.timelimiter.TimeLimiterOperator.withTimeout(TimeLimiterOperator.java:63)
	|_          Mono.doOnNext ⇢ at io.github.resilience4j.reactor.timelimiter.TimeLimiterOperator.withTimeout(TimeLimiterOperator.java:64)
	|_       Mono.doOnSuccess ⇢ at io.github.resilience4j.reactor.timelimiter.TimeLimiterOperator.withTimeout(TimeLimiterOperator.java:65)
	|_         Mono.doOnError ⇢ at io.github.resilience4j.reactor.timelimiter.TimeLimiterOperator.withTimeout(TimeLimiterOperator.java:66)
	*__Mono.transformDeferred ⇢ at io.eventuate.examples.tram.sagas.ordersandcustomers.apigateway.proxies.OrderServiceProxy.findOrdersByCustomerId(OrderServiceProxy.java:46)
Original Stack Trace:
		at io.eventuate.examples.tram.sagas.ordersandcustomers.apigateway.proxies.OrderServiceProxy.lambda$findOrdersByCustomerId$0(OrderServiceProxy.java:43) ~[classes!/:na]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:125) ~[reactor-core-3.4.17.jar!/:3.4.17]
		at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) ~[reactor-core-3.4.17.jar!/:3.4.17]
		at org.springframework.cloud.sleuth.instrument.web.client.TraceExchangeFilterFunction$TraceWebClientSubscriber.onNext(TraceExchangeFilterFunction.java:197) ~[spring-cloud-sleuth-instrumentation-3.1.2.jar!/:3.1.2]

composeUp

Appears to recreate services but not API gateway

eventuate-tram-sagas-examples-customers-and-orders_mysql_1 is up-to-date
eventuate-tram-sagas-examples-customers-and-orders_api-gateway-service_1 is up-to-date
eventuate-tram-sagas-examples-customers-and-orders_zookeeper_1 is up-to-date
eventuate-tram-sagas-examples-customers-and-orders_zipkin_1 is up-to-date
eventuate-tram-sagas-examples-customers-and-orders_kafka_1 is up-to-date
eventuate-tram-sagas-examples-customers-and-orders_cdc-service_1 is up-to-date
Recreating eventuate-tram-sagas-examples-customers-and-orders_order-service_1 ... 
Recreating eventuate-tram-sagas-examples-customers-and-orders_customer-service_1 ... 
Recreating eventuate-tram-sagas-examples-customers-and-orders_customer-service_1 ... done
Recreating eventuate-tram-sagas-examples-customers-and-orders_order-service_1    ... done

Swagger UI test failing in wip-spring-boot3 branch

Class io.eventuate.examples.tram.sagas.ordersandcustomers.endtoendtests.CustomersAndOrdersEndToEndTest

java.lang.AssertionError: Expected 200 for http://localhost:63998/swagger-ui/index.html, got 404
	at org.junit.Assert.fail(Assert.java:89)
	at io.eventuate.examples.tram.sagas.ordersandcustomers.endtoendtests.CustomersAndOrdersEndToEndTest.assertUrlStatusIsOk(CustomersAndOrdersEndToEndTest.java:193)
	at io.eventuate.examples.tram.sagas.ordersandcustomers.endtoendtests.CustomersAndOrdersEndToEndTest.testSwaggerUiUrl(CustomersAndOrdersEndToEndTest.java:187)
	at io.eventuate.examples.tram.sagas.ordersandcustomers.endtoendtests.CustomersAndOrdersEndToEndTest.testSwaggerUiUrls(CustomersAndOrdersEndToEndTest.java:181)

Part of eventuate-foundation/eventuate-common#131 work

How to notify the front-end on Saga Completion with WebSockets

Hi @cer @dartartem and everybody else, I have currently finished all of my server-side work. Now I am using GRPC from the services to the frontend. This works fine, however the response is received before the saga has actually completed/failed.

One way of fixing this is having the frontend poll the server side on some endpoint and it return the primary Entity that has been saved by that saga. However, this seems overkill and isn't very good in my opinion.

So then I decided to use GRPC. My problem with GRPC on the server end is that I cannot send a message back to the client from another class (ie. The Class that has the Eventuate Saga Definitions). I saw that there is a method called onSagaCompletedSuccessfully or the onSagaRolledBack - which is great - nice work, I like that. However, I cannot do a responseObserver.onNext(response) from there as it's outside the GRPC implementation class.

I appreciate that this doesn't really have anything to do with the Eventuate Framework itself, however I thought that @cer wrote a book on this at some point - was wondering if him or anybody had a solution to this. Sorry if this is a vague question but I'd massively appreciate any help/pointers. Hopefully you understand what I mean.

my problem

The biggest problem is how to run in idea or eclipse

Setting Partition ID when sending a command

I am not able to set the PARTITION_ID (or message headers in general) in a command that is sent to a saga participant. It seems that I could setup messageInterceptors and maybe update it there but it's kind of a workaround.

Is there a recommended way to do that?

Error on Customers Service while consuming (Order Service generated) message

Order Service is creating a new Order successfully and update the 'eventuate.message' correctly.
Then Eventuate Tram CDC Service will send that message into Customers Service successfully (via the consumerService topic).
Customers Service is producing following exception while it consuming that message.
Thanks in advance.

2020-10-05 16:56:52.462  INFO 9988 --- [           main] com.netflix.discovery.DiscoveryClient    : Starting heartbeat executor: renew interval is: 30
2020-10-05 16:56:52.464  INFO 9988 --- [           main] c.n.discovery.InstanceInfoReplicator     : InstanceInfoReplicator onDemand update allowed rate per min is 4
2020-10-05 16:56:52.468  INFO 9988 --- [           main] com.netflix.discovery.DiscoveryClient    : Discovery Client initialized at timestamp 1601888212467 with initial instances count: 5
2020-10-05 16:56:52.470  INFO 9988 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application SAGA-CONSUMER-SERVICE with eureka with status UP
2020-10-05 16:56:52.471  INFO 9988 --- [           main] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1601888212471, current=UP, previous=STARTING]
2020-10-05 16:56:52.474  INFO 9988 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SAGA-CONSUMER-SERVICE/ChannaX240.mshome.net:saga-consumer-service:7111: registering service...
2020-10-05 16:56:52.536  INFO 9988 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SAGA-CONSUMER-SERVICE/ChannaX240.mshome.net:saga-consumer-service:7111 - registration status: 204
2020-10-05 16:56:52.542  INFO 9988 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 7111 (http) with context path ''
2020-10-05 16:56:52.543  INFO 9988 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 7111
2020-10-05 16:56:54.451  INFO 9988 --- [           main] com.ee.ic.serviceframe.BootStrap       : Started BootStrap in 23.001 seconds (JVM running for 23.724)
2020-10-05 16:57:52.498  INFO 9988 --- [freshExecutor-0] o.a.http.impl.client.DefaultHttpClient   : I/O exception (org.apache.http.NoHttpResponseException) caught when processing request to {}->http://localhost:8761: The target server failed to respond
2020-10-05 16:57:52.499  INFO 9988 --- [freshExecutor-0] o.a.http.impl.client.DefaultHttpClient   : Retrying request to {}->http://localhost:8761
2020-10-05 16:59:32.601 DEBUG 9988 --- [mmandDispatcher] i.e.m.k.b.c.EventuateKafkaConsumer       : Got customerCommandDispatcher 1 records
2020-10-05 16:59:32.601 DEBUG 9988 --- [mmandDispatcher] i.e.m.k.b.c.EventuateKafkaConsumer       : processing record customerCommandDispatcher 0 [123, 34, 112, 97, 121, 108, 111, 97, 100, 34, 58, 34, 123, 92, 34, 111, 114, 100, 101, 114, 73, 100, 92, 34, 58, 49, 52, 44, 92, 34, 111, 114, 100, 101, 114, 84, 111, 116, 97, 108, 92, 34, 58, 123, 92, 34, 97, 109, 111, 117, 110, 116, 92, 34, 58, 52, 125, 44, 92, 34, 99, 117, 115, 116, 111, 109, 101, 114, 73, 100, 92, 34, 58, 49, 125, 34, 44, 34, 104, 101, 97, 100, 101, 114, 115, 34, 58, 123, 34, 99, 111, 109, 109, 97, 110, 100, 95, 115, 97, 103, 97, 95, 105, 100, 34, 58, 34, 48, 48, 48, 48, 48, 49, 55, 52, 102, 55, 102, 99, 99, 50, 100, 97, 45, 54, 56, 102, 55, 50, 56, 51, 97, 57, 97, 102, 54, 48, 48, 48, 48, 34, 44, 34, 68, 65, 84, 69, 34, 58, 34, 77, 111, 110, 44, 32, 53, 32, 79, 99, 116, 32, 50, 48, 50, 48, 32, 48, 56, 58, 53, 57, 58, 51, 49, 32, 71, 77, 84, 34, 44, 34, 99, 111, 109, 109, 97, 110, 100, 95, 116, 121, 112, 101, 34, 58, 34, 99, 111, 109, 46, 115, 116, 101, 101, 46, 105, 99, 46, 115, 101, 114, 118, 105, 99, 101, 102, 114, 97, 109, 101, 46, 99, 117, 115, 116, 111, 109, 101, 114, 115, 46, 97, 112, 105, 46, 99, 111, 109, 109, 97, 110, 100, 115, 46, 82, 101, 115, 101, 114, 118, 101, 67, 114, 101, 100, 105, 116, 67, 111, 109, 109, 97, 110, 100, 34, 44, 34, 99, 111, 109, 109, 97, 110, 100, 95, 114, 101, 112, 108, 121, 95, 116, 111, 34, 58, 34, 99, 111, 109, 46, 115, 116, 101, 101, 46, 105, 99, 46, 115, 101, 114, 118, 105, 99, 101, 102, 114, 97, 109, 101, 46, 99, 111, 109, 109, 111, 110, 46, 115, 97, 103, 97, 46, 67, 114, 101, 97, 116, 101, 79, 114, 100, 101, 114, 83, 97, 103, 97, 45, 114, 101, 112, 108, 121, 34, 44, 34, 68, 69, 83, 84, 73, 78, 65, 84, 73, 79, 78, 34, 58, 34, 99, 117, 115, 116, 111, 109, 101, 114, 83, 101, 114, 118, 105, 99, 101, 34, 44, 34, 99, 111, 109, 109, 97, 110, 100, 95, 115, 97, 103, 97, 95, 116, 121, 112, 101, 34, 58, 34, 99, 111, 109, 46, 115, 116, 101, 101, 46, 105, 99, 46, 115, 101, 114, 118, 105, 99, 101, 102, 114, 97, 109, 101, 46, 99, 111, 109, 109, 111, 110, 46, 115, 97, 103, 97, 46, 67, 114, 101, 97, 116, 101, 79, 114, 100, 101, 114, 83, 97, 103, 97, 34, 44, 34, 99, 111, 109, 109, 97, 110, 100, 95, 95, 100, 101, 115, 116, 105, 110, 97, 116, 105, 111, 110, 34, 58, 34, 99, 117, 115, 116, 111, 109, 101, 114, 83, 101, 114, 118, 105, 99, 101, 34, 44, 34, 73, 68, 34, 58, 34, 48, 48, 48, 48, 48, 49, 55, 52, 102, 55, 102, 99, 99, 52, 49, 100, 45, 54, 56, 102, 55, 50, 56, 51, 97, 57, 97, 102, 54, 48, 48, 48, 48, 34, 125, 44, 34, 105, 100, 34, 58, 34, 48, 48, 48, 48, 48, 49, 55, 52, 102, 55, 102, 99, 99, 52, 49, 100, 45, 54, 56, 102, 55, 50, 56, 51, 97, 57, 97, 102, 54, 48, 48, 48, 48, 34, 125]
2020-10-05 16:59:32.602 DEBUG 9988 --- [mmandDispatcher] i.e.m.k.b.c.EventuateKafkaConsumer       : EventuateKafkaAggregateSubscriptions subscriber = customerCommandDispatcher, offset = 0, key = 00000174f7fcc41d-68f7283a9af60000, value = [B@61d0191b
2020-10-05 16:59:32.608 DEBUG 9988 --- [mmandDispatcher] i.e.m.k.b.c.EventuateKafkaConsumer       : Processed customerCommandDispatcher 1 records
2020-10-05 16:59:32.608 DEBUG 9988 --- [mmandDispatcher] i.e.m.k.b.c.EventuateKafkaConsumer       : To commit customerCommandDispatcher io.eventuate.messaging.kafka.basic.consumer.OffsetTracker@15aba9f6[state={customerService-0=io.eventuate.messaging.kafka.basic.consumer.TopicPartitionOffsets@5398cd8d[unprocessed=[0],processed=[]]}]
2020-10-05 16:59:32.732 ERROR 9988 --- [pool-1-thread-1] i.e.t.c.c.DecoratedMessageHandlerFactory : Got exception customerCommandDispatcher 00000174f7fcc41d-68f7283a9af60000
2020-10-05 16:59:32.744 ERROR 9988 --- [pool-1-thread-1] i.e.t.c.c.DecoratedMessageHandlerFactory : Got exception 

java.lang.RuntimeException: No method for io.eventuate.tram.messaging.common.MessageImpl@902a931[payload={"orderId":14,"orderTotal":{"amount":4},"customerId":1},headers={command_saga_id=00000174f7fcc2da-68f7283a9af60000, DATE=Mon, 5 Oct 2020 08:59:31 GMT, command_type=comtee.ic.serviceframe.customers.api.commands.ReserveCreditCommand, command_reply_to=com.ee.ic.serviceframe.common.saga.CreateOrderSaga-reply, DESTINATION=customerService, command_saga_type=com.ee.ic.serviceframe.common.saga.CreateOrderSaga, command__destination=customerService, ID=00000174f7fcc41d-68f7283a9af60000}]
	at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:58) ~[eventuate-tram-commands-0.24.0.RELEASE.jar:na]
	at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-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.5.RELEASE.jar:5.2.5.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.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator$$EnhancerBySpringCGLIB$$11288949.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]
	at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.24.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:71) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:41) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_112]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_112]
	at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_112]

2020-10-05 16:59:32.745 ERROR 9988 --- [pool-1-thread-1] .c.PrePostHandlerMessageHandlerDecorator : decoration failed

java.lang.RuntimeException: No method for io.eventuate.tram.messaging.common.MessageImpl@902a931[payload={"orderId":14,"orderTotal":{"amount":4},"customerId":1},headers={command_saga_id=00000174f7fcc2da-68f7283a9af60000, DATE=Mon, 5 Oct 2020 08:59:31 GMT, command_type=com.ee.ic.serviceframe.customers.api.commands.ReserveCreditCommand, command_reply_to=com.ee.ic.serviceframe.common.saga.CreateOrderSaga-reply, DESTINATION=customerService, command_saga_type=com.ee.ic.serviceframe.common.saga.CreateOrderSaga, command__destination=customerService, ID=00000174f7fcc41d-68f7283a9af60000}]
	at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:58) ~[eventuate-tram-commands-0.24.0.RELEASE.jar:na]
	at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-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.5.RELEASE.jar:5.2.5.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.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator$$EnhancerBySpringCGLIB$$11288949.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]
	at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.24.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:71) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:41) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_112]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_112]
	at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_112]

2020-10-05 16:59:32.751 ERROR 9988 --- [pool-1-thread-1] i.e.m.k.b.c.KafkaMessageProcessor        : Got exception: 

java.lang.RuntimeException: No method for io.eventuate.tram.messaging.common.MessageImpl@902a931[payload={"orderId":14,"orderTotal":{"amount":4},"customerId":1},headers={command_saga_id=00000174f7fcc2da-68f7283a9af60000, DATE=Mon, 5 Oct 2020 08:59:31 GMT, command_type=com.ee.ic.serviceframe.customers.api.commands.ReserveCreditCommand, command_reply_to=com.ee.ic.serviceframe.common.saga.CreateOrderSaga-reply, DESTINATION=customerService, command_saga_type=com.ee.ic.serviceframe.common.saga.CreateOrderSaga, command__destination=customerService, ID=00000174f7fcc41d-68f7283a9af60000}]
	at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:58) ~[eventuate-tram-commands-0.24.0.RELEASE.jar:na]
	at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-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.5.RELEASE.jar:5.2.5.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.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator$$EnhancerBySpringCGLIB$$11288949.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]
	at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.24.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:71) [eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:41) [eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_112]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_112]
	at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_112]

2020-10-05 16:59:32.752 ERROR 9988 --- [pool-1-thread-1] i.e.m.kafka.consumer.SwimlaneDispatcher  : Exception handling message - terminating

java.lang.RuntimeException: No method for io.eventuate.tram.messaging.common.MessageImpl@902a931[payload={"orderId":14,"orderTotal":{"amount":4},"customerId":1},headers={command_saga_id=00000174f7fcc2da-68f7283a9af60000, DATE=Mon, 5 Oct 2020 08:59:31 GMT, command_type=com.ee.ic.serviceframe.customers.api.commands.ReserveCreditCommand, command_reply_to=com.ee.ic.serviceframe.common.saga.CreateOrderSaga-reply, DESTINATION=customerService, command_saga_type=com.ee.ic.serviceframe.common.saga.CreateOrderSaga, command__destination=customerService, ID=00000174f7fcc41d-68f7283a9af60000}]
	at io.eventuate.tram.commands.consumer.CommandDispatcher.messageHandler(CommandDispatcher.java:58) ~[eventuate-tram-commands-0.24.0.RELEASE.jar:na]
	at io.eventuate.tram.sagas.participant.SagaCommandDispatcher.messageHandler(SagaCommandDispatcher.java:42) ~[eventuate-tram-sagas-participant-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.5.RELEASE.jar:5.2.5.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.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at io.eventuate.tram.spring.optimisticlocking.OptimisticLockingDecorator$$EnhancerBySpringCGLIB$$11288949.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]
	at io.eventuate.tram.consumer.kafka.EventuateTramKafkaMessageConsumer.lambda$subscribe$0(EventuateTramKafkaMessageConsumer.java:29) ~[eventuate-tram-consumer-kafka-0.24.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.handle(MessageConsumerKafkaImpl.java:71) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.MessageConsumerKafkaImpl.lambda$null$0(MessageConsumerKafkaImpl.java:41) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at io.eventuate.messaging.kafka.consumer.SwimlaneDispatcher.processQueuedMessage(SwimlaneDispatcher.java:72) ~[eventuate-messaging-kafka-consumer-0.9.0.RELEASE.jar:na]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_112]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_112]
	at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_112]

Error application has no configured error view

After running commands if I try to access swagger, I get this error
Whitelabel Error Page
This application has no configured error view, so you are seeing this as a fallback.

Wed Jun 16 17:02:14 UTC 2021
[4ed80cd8-79922] There was an unexpected error (type=Internal Server Error, status=500).
class path resource [META-INF/swagger-ui/index.html] cannot be opened because it does not exist

org.springframework.dao.DataIntegrityViolationException - HELP NEEDED!

Hi, @dartartem @cer , I have just encountered this very odd issue. After a method is called by a saga (in-between steps), I am getting this exception:

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [UPDATE eventuate.saga_instance SET state_name = ?, last_request_id = ?, saga_data_type = ?, saga_data_json = ?, end_state = ?, compensating = ? where saga_type = ? AND saga_id = ?]; ERROR: value too long for type character varying(1000); nested exception is org.postgresql.util.PSQLException: ERROR: value too long for type character varying(1000)
	at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:862) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:917) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:927) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at io.eventuate.common.common.spring.jdbc.EventuateSpringJdbcStatementExecutor.update(EventuateSpringJdbcStatementExecutor.java:23) ~[eventuate-common-common-spring-jdbc-0.9.0.RELEASE.jar!/:na]
	at io.eventuate.tram.sagas.orchestration.SagaInstanceRepositoryJdbc.update(SagaInstanceRepositoryJdbc.java:146) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
	at io.eventuate.tram.sagas.orchestration.SagaManagerImpl.processActions(SagaManagerImpl.java:222) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
	at io.eventuate.tram.sagas.orchestration.SagaManagerImpl.create(SagaManagerImpl.java:105) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
	at io.eventuate.tram.sagas.orchestration.SagaManagerImpl.create(SagaManagerImpl.java:69) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
	at io.eventuate.tram.sagas.orchestration.SagaInstanceFactory.create(SagaInstanceFactory.java:21) ~[eventuate-tram-sagas-orchestration-0.13.0.RELEASE.jar!/:na]
	at com.allocationengine.AllocationControllerGrpc.allocate(AllocationControllerGrpc.java:52) ~[classes!/:na]
	at com.allocationServiceGrpc$MethodHandlers.invoke(AllocationServiceGrpc.java:209) ~[api-common-library-0.0.1-SNAPSHOT.jar!/:na]
	at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:171) ~[grpc-stub-1.16.1.jar!/:1.16.1]
	at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:283) ~[grpc-core-1.16.1.jar!/:1.16.1]
	at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:710) ~[grpc-core-1.16.1.jar!/:1.16.1]
	at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.16.1.jar!/:1.16.1]
	at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) ~[grpc-core-1.16.1.jar!/:1.16.1]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_282]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_282]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_282]
aused by: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(1000)
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2476) ~[postgresql-42.1.1.jar!/:42.1.1]
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2189) ~[postgresql-42.1.1.jar!/:42.1.1]
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:300) ~[postgresql-42.1.1.jar!/:42.1.1]
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428) ~[postgresql-42.1.1.jar!/:42.1.1]
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354) ~[postgresql-42.1.1.jar!/:42.1.1]
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:169) ~[postgresql-42.1.1.jar!/:42.1.1]
	at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:136) ~[postgresql-42.1.1.jar!/:42.1.1]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-3.4.5.jar!/:na]
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.5.jar!/:na]
	at org.springframework.jdbc.core.JdbcTemplate.lambda$update$0(JdbcTemplate.java:867) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617) ~[spring-jdbc-5.2.9.RELEASE.jar!/:5.2.9.RELEASE]
	... 19 common frames omitted

Here is my saga definition too:

@Override
public SagaDefinition<AllocateSagaData> getSagaDefinition() {
    return step()
            .invokeLocal(allocationEngine::allocateTickets)
            .withCompensation(sagaData -> {
            })
            .step()
            .invokeParticipant(sagaData -> allocationEngine.updateStatus(sagaData.getId(), Common.Status.ALLOCATED))
            .withCompensation(sagaData -> allocationEngine.updateStatus(sagaData.getId(), Common.Status.OPEN))
            .step()
            .invokeParticipant(sagaData -> allocationEngine.allocateTickets(sagaData.getTickets()))
            .build();
}

It completes the first step, .invokeLocal(allocationEngine::allocateTickets)

but then it completely falls over in between in some eventuate classes?

Any help or pointers would be much appreciated, I'm trying to get this shipped as soon as possible!!

License

Thanks for providing this repo.

Could you please add a license to it?

Eventuate CDC isn't working with my own Postgres Database

Hi all,

I just want to start off by saying how much I like your framework, even though I haven't got my sagas working yet, Eventuate Sagas makes developing the sagas much easier rather than having to implement all of this stuff ourselves!

Just a quick question about the Eventuate CDC (from your Docker image) - do I need to link this and all of my spring cloud services to a Postgres database that runs on your image specifically? I thought the only difference between the DB created in the saga-customers-and-orders-example https://github.com/eventuate-tram/eventuate-tram-sagas-examples-customers-and-orders was that some tables were already created - and that the CDC would just create them anyway? Or does it not work like that?

Here is my stacktrace coming from the CDC:

java.lang.RuntimeException: Cannot get table io.eventuate.local.common.SchemaAndTable@50514dec[schema=eventuate,tableName=message]: result set is empty
        at io.eventuate.local.polling.PollingDao.queryPrimaryKey(PollingDao.java:235) [eventuate-local-java-cdc-connector-polling-0.10.0-SNAPSHOT.jar!/:na]
        at io.eventuate.local.polling.PollingDao.lambda$getPrimaryKey$4(PollingDao.java:208) [eventuate-local-java-cdc-connector-polling-0.10.0-SNAPSHOT.jar!/:na]
        at io.eventuate.local.common.DaoUtils.handleConnectionLost(DaoUtils.java:22) ~[eventuate-local-java-cdc-connector-common-0.10.0-SNAPSHOT.jar!/:na]
        at io.eventuate.local.polling.PollingDao.getPrimaryKey(PollingDao.java:206) [eventuate-local-java-cdc-connector-polling-0.10.0-SNAPSHOT.jar!/:na]
        at io.eventuate.local.polling.PollingDao.processEvents(PollingDao.java:113) [eventuate-local-java-cdc-connector-polling-0.10.0-SNAPSHOT.jar!/:na]
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_252]
        at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[na:1.8.0_252]
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[na:1.8.0_252]
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) ~[na:1.8.0_252]
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_252]
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_252]
        at java.util.stream.ReferencePipeline.reduce(ReferencePipeline.java:541) ~[na:1.8.0_252]
        at io.eventuate.local.polling.PollingDao.start(PollingDao.java:93) [eventuate-local-java-cdc-connector-polling-0.10.0-SNAPSHOT.jar!/:na]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_252]

2021-01-20 06:05:26.708 ERROR 6 --- [       Thread-6] io.eventuate.local.common.DaoUtils       : Could not access database Cannot get table io.eventuate.local.common.SchemaAndTable@50514dec[schema=eventuate,tableName=message
]: result set is empty - retrying in 500 milliseconds

In my Kubernetes Deployment for this, I have pointed at the image to the same tag, like this eventuateio/eventuate-cdc-service:0.6.1.RELEASE - do I need to specify a specific version number as well?

Also, do all of my services still need to be linked to the same database or is that happening just for less complication for example?

Thanks,

Ben

Question on OrderService requesting for resources from CustomerService

I not sure whether you will see this, but if you do please do have a look at my problem.

Assuming that in Order database, we store customerId to reference to the specific customer. However, if the HTTP/POST request to OrderService contains only customerName, how should we get the customerId from CustomerService?

All I can think of is sending a HTTP/GET to Customer Service for the resource. Is it possible to send an event and waits for a response from CustomerService?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.