* cross app ex Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * update protoc cmd Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * feedback Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * builder pattern Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * fix protoc Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * debug log levels for test containers Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * update readme and add debugging info Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * add IT test for cross app call activity Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * cleanup test Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * sysout -> ctx.logger Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * reset pom Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * rm debug lines from readme Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * fix header + rm customports Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * use consts Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * rm waitfor call Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * rm pubsub Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * rm timeout Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * reset empty lines added Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * reset appname for daprcontainer Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * reset empty line diff Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * rm constructor info from readme Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * debug -> info Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * rm super.start Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * reset dapr container diff Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * add test for codecov Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * up timeout time to unblock PR Signed-off-by: Cassandra Coyle <cassie@diagrid.io> * deps: Update durabletask-client to 1.5.10 Signed-off-by: Javier Aliaga <javier@diagrid.io> * ci: Revert build timeout Signed-off-by: Javier Aliaga <javier@diagrid.io> * review: Use ctx.getLogger Signed-off-by: Javier Aliaga <javier@diagrid.io> * chore: Fix review comments Signed-off-by: Javier Aliaga <javier@diagrid.io> * chore: more review comments fixes Signed-off-by: Javier Aliaga <javier@diagrid.io> * test: Use testcontainers in CrossApp IT test Signed-off-by: Javier Aliaga <javier@diagrid.io> * chore: Load classpath for IT with all dependencies Signed-off-by: Javier Aliaga <javier@diagrid.io> --------- Signed-off-by: Cassandra Coyle <cassie@diagrid.io> Signed-off-by: Javier Aliaga <javier@diagrid.io> Co-authored-by: Javier Aliaga <javier@diagrid.io> |
||
---|---|---|
.. | ||
consumer-app | ||
kubernetes | ||
producer-app | ||
workflows | ||
README.md | ||
pom.xml | ||
spotbugs-exclude.xml |
README.md
Dapr Spring Boot and Testcontainers integration Example
This example consists of two applications:
- Producer App:
- Publish messages using a Spring Messaging approach
- Store and retrieve information using Spring Data CrudRepository
- Implements a Workflow with Dapr Workflows
- Consumer App:
- Subscribe to messages
Running these examples from source code
To run these examples you will need:
- Java SDK
- Maven
- Docker or a container runtime such as Podman
From the spring-boot-examples/
directory you can start each service using the test configuration that uses
Testcontainers to boostrap Dapr by running the following command:
cd producer-app/
../../mvnw -Dspring-boot.run.arguments="--reuse=true" spring-boot:test-run
This will start the producer-app
with Dapr services and the infrastructure needed by the application to run,
in this case RabbitMQ and PostgreSQL. The producer-app
starts on port 8080
by default.
The -Dspring-boot.run.arguments="--reuse=true"
flag helps the application to connect to an existing shared
infrastructure if it already exists. For development purposes, and to connect both applications we will set the flag
in both. For more details check the DaprTestContainersConfig.java
classes in both, the producer-app
and the consumer-app
.
Then run in a different terminal:
cd consumer-app/
../../mvnw -Dspring-boot.run.arguments="--reuse=true" spring-boot:test-run
The consumer-app
starts in port 8081
by default.
Interacting with the applications
Now that both applications are up you can place an order by sending a POST request to :8080/orders/
You can use curl
to send a POST request to the producer-app
:
curl -X POST localhost:8080/orders -H 'Content-Type: application/json' -d '{ "item": "the mars volta EP", "amount": 1 }'
If you check the producer-app
logs you should see the following lines:
...
Storing Order: Order{id='null', item='the mars volta EP', amount=1}
Publishing Order Event: Order{id='d4f8ea15-b774-441e-bcd2-7a4208a80bec', item='the mars volta EP', amount=1}
If you check the consumer-app
logs you should see the following lines, showing that the message
published by the producer-app
was correctly consumed by the consumer-app
:
Order Event Received: Order{id='d4f8ea15-b774-441e-bcd2-7a4208a80bec', item='the mars volta EP', amount=1}
Next, you can create a new customer to trigger the customer's tracking workflow:
curl -X POST localhost:8080/customers -H 'Content-Type: application/json' -d '{ "customerName": "salaboy" }'
A new Workflow Instance was created to track the customers interactions. Now, the workflow instance is waiting for the customer to request a follow-up.
You should see in the producer-app
logs:
Workflow instance <Workflow Instance Id> started
Let's register the customer: salaboy
Customer: salaboy registered.
Let's wait for the customer: salaboy to request a follow up.
Send an event simulating the customer request for a follow-up:
curl -X POST localhost:8080/customers/followup -H 'Content-Type: application/json' -d '{ "customerName": "salaboy" }'
In the producer-app
logs you should see that the workflow instance id moved forward to the Customer Follow Up activity:
Customer follow-up requested: salaboy
Let's book a follow up for the customer: salaboy
Customer: salaboy follow-up done.
Congratulations the customer: salaboy is happy!
Running on Kubernetes
You can run the same example on a Kubernetes cluster. Check the Kubernetes tutorial here.