* adding spring boot producer Signed-off-by: salaboy <Salaboy@gmail.com> * adding consumer app Signed-off-by: salaboy <Salaboy@gmail.com> * increasing wait for events to popup Signed-off-by: salaboy <Salaboy@gmail.com> * adding readme and examples Signed-off-by: salaboy <Salaboy@gmail.com> * aligning tests for examples Signed-off-by: salaboy <Salaboy@gmail.com> * increasing time out Signed-off-by: salaboy <Salaboy@gmail.com> * adding health check from the sidecar Signed-off-by: salaboy <Salaboy@gmail.com> * feat: Adding basic HTTPEndpoint configuration support in testcontainers module (#1210) * feat: Adding basic HTTPEndpoint configuration support in testcontainers module Signed-off-by: Laurent Broudoux <laurent.broudoux@gmail.com> * feat: #1209 Adding test for HTTPEndpoint in testcontainers module Signed-off-by: Laurent Broudoux <laurent.broudoux@gmail.com> --------- Signed-off-by: Laurent Broudoux <laurent.broudoux@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * updating example Signed-off-by: salaboy <Salaboy@gmail.com> * fixing example Signed-off-by: salaboy <Salaboy@gmail.com> * Add app health check support to Dapr Testcontainer (#1213) * Add app health check support to Dapr Testcontainer Signed-off-by: Artur Ciocanu <ciocanu@adobe.com> * Some minor cleanup Signed-off-by: Artur Ciocanu <ciocanu@adobe.com> * Move waiting to beforeEach, it looks more natural Signed-off-by: Artur Ciocanu <ciocanu@adobe.com> --------- Signed-off-by: Artur Ciocanu <ciocanu@adobe.com> Co-authored-by: Artur Ciocanu <ciocanu@adobe.com> Signed-off-by: salaboy <Salaboy@gmail.com> * commenting reuse Signed-off-by: salaboy <Salaboy@gmail.com> * adding how to run on Kubernetes, unfortunately we need to create containers Signed-off-by: salaboy <Salaboy@gmail.com> * removing subscription and fixing scopes Signed-off-by: salaboy <Salaboy@gmail.com> * adding license headers and logger Signed-off-by: salaboy <Salaboy@gmail.com> * updating logs Signed-off-by: salaboy <Salaboy@gmail.com> * updating READMEs and update_sdk_version for new module Signed-off-by: salaboy <Salaboy@gmail.com> * removing old line Signed-off-by: salaboy <Salaboy@gmail.com> * removing sleeps, using Wait Signed-off-by: salaboy <Salaboy@gmail.com> * updating Kubernetes tutorial to use local registry with KIND, and provide steps to create containers with spring boot Signed-off-by: salaboy <Salaboy@gmail.com> * adding new lines and formatting Signed-off-by: salaboy <Salaboy@gmail.com> * updating reuse and removing comments Signed-off-by: salaboy <Salaboy@gmail.com> * fixing reuse Signed-off-by: salaboy <Salaboy@gmail.com> * removing line break Signed-off-by: salaboy <Salaboy@gmail.com> * fixing custom line breaks Signed-off-by: salaboy <Salaboy@gmail.com> * fixing xml indent to 2 spaces Signed-off-by: salaboy <Salaboy@gmail.com> * Update spring-boot-examples/README.md Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * Update spring-boot-examples/README.md Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * Update spring-boot-examples/README.md Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * Update spring-boot-examples/README.md Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * Update spring-boot-examples/README.md Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * Update spring-boot-examples/consumer-app/src/test/java/io/dapr/springboot/examples/consumer/ConsumerAppTests.java Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * Update spring-boot-examples/producer-app/src/test/java/io/dapr/springboot/examples/producer/TestSubscriberRestController.java Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Signed-off-by: salaboy <Salaboy@gmail.com> * adding license header to missing files Signed-off-by: salaboy <Salaboy@gmail.com> * adding automated testing for spring boot example Signed-off-by: salaboy <Salaboy@gmail.com> * adding sb examples to the validation pipeline Signed-off-by: salaboy <Salaboy@gmail.com> * updating timeouts Signed-off-by: salaboy <Salaboy@gmail.com> * updating return codes Signed-off-by: salaboy <Salaboy@gmail.com> --------- Signed-off-by: salaboy <Salaboy@gmail.com> Signed-off-by: Laurent Broudoux <laurent.broudoux@gmail.com> Signed-off-by: Artur Ciocanu <ciocanu@adobe.com> Signed-off-by: Artur Souza <artursouza.ms@outlook.com> Co-authored-by: Laurent Broudoux <laurent.broudoux@gmail.com> Co-authored-by: artur-ciocanu <artur.ciocanu@gmail.com> Co-authored-by: Artur Ciocanu <ciocanu@adobe.com> Co-authored-by: Cassie Coyle <cassie.i.coyle@gmail.com> Co-authored-by: Cassie Coyle <cassie@diagrid.io> Co-authored-by: Artur Souza <artursouza.ms@outlook.com> |
||
|---|---|---|
| .. | ||
| consumer-app | ||
| kubernetes | ||
| producer-app | ||
| 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.