The goal of this project is to play with Solace PubSub+
. For it, we will implement a producer and consumer of different types of news
about many countries and cities.
On ivangfr.github.io, I have compiled my Proof-of-Concepts (PoCs) and articles. You can easily search for the technology you are interested in by using the filter. Who knows, perhaps I have already implemented a PoC or written an article about what you are looking for.
- [Medium] Solace PubSub+ and Spring Boot: Implementing News Producer and Consumer Apps
- [Medium] Solace PubSub+ and Spring Boot: Implementing Unit Tests for News Producer and Consumer Apps
- [Medium] Solace PubSub+ and Spring Boot: Implementing End-to-End Tests for News Producer and Consumer Apps
- [Medium] Solace PubSub+ and Spring Boot: Running News Producer and Consumer Apps in Minikube (Kubernetes)
-
Spring Boot
application that exposes a REST API to submitnews
events. It published news to the following destination with format:ps/news/{type}/{country}/{city}
Endpoints
POST /api/news {"type": [SPORT|ECONOMY|HEALTH], "country": "...", "city": "...", "title": "..."} POST /api/news/random {"number": ..., "delay": ...}
-
Spring Boot
application that consumes thenews
events published byproducer-service
.
-
Open a terminal and inside
spring-cloud-stream-solace-pubsub
root folder run:docker compose up -d
-
Wait for
solace
Docker container to be up and running. To check it, run:docker compose ps
-
producer-service
- In a terminal, make sure you are in
spring-cloud-stream-solace-pubsub
root folder; - Run the commands below to start the application:
./mvnw clean spring-boot:run --projects producer-service
- In a terminal, make sure you are in
-
consumer-service-1
- It subscribes to all news from
Brazil
; - Open a new terminal and navigate to
spring-cloud-stream-solace-pubsub
root folder; - Run the commands below to start the application:
export NEWS_SUBSCRIPTION="ps/news/*/BR/>" ./mvnw clean spring-boot:run --projects consumer-service
- It subscribes to all news from
-
consumer-service-2
- It subscribes to all news related to
HEALTH
; - Open a new terminal and navigate to
spring-cloud-stream-solace-pubsub
root folder; - Run the commands below to start the application:
export SERVER_PORT=9082 export NEWS_SUBSCRIPTION="ps/news/HEALTH/>" ./mvnw spring-boot:run --projects consumer-service
- It subscribes to all news related to
-
- In a terminal, make sure you are inside
spring-cloud-stream-solace-pubsub
root folder; - Run the following script to build the Docker images:
- JVM
./docker-build.sh
- Native (it's not implemented yet)
./docker-build.sh native
- JVM
- In a terminal, make sure you are inside
-
-
producer-service
Environment Variable Description SOLACE_HOST
Specify host of the Solace PubSub+
message broker to use (defaultlocalhost
)SOLACE_PORT
Specify port of the Solace PubSub+
message broker to use (default55556
) -
consumer-service
Environment Variable Description SOLACE_HOST
Specify host of the Solace PubSub+
message broker to use (defaultlocalhost
)SOLACE_PORT
Specify port of the Solace PubSub+
message broker to use (default55556
)
-
-
-
producer-service
Run the following command in a terminal:
docker run --rm --name producer-service \ -p 9080:9080 \ -e SOLACE_HOST=solace -e SOLACE_PORT=55555 \ --network=spring-cloud-stream-solace-pubsub_default \ ivanfranchin/producer-service:1.0.0
-
consumer-service-1
- It subscribes to all news from
Brazil
; - Open a new terminal and run the following command:
docker run --rm --name consumer-service-1 \ -p 9081:9081 \ -e SOLACE_HOST=solace -e SOLACE_PORT=55555 \ -e NEWS_SUBSCRIPTION="ps/news/*/BR/>" \ --network=spring-cloud-stream-solace-pubsub_default \ ivanfranchin/consumer-service:1.0.0
- It subscribes to all news from
-
consumer-service-2
- It subscribes to all news related to
HEALTH
; - Open a new terminal and run the following command:
docker run --rm --name consumer-service-2 \ -p 9082:9081 \ -e SOLACE_HOST=solace -e SOLACE_PORT=55555 \ -e NEWS_SUBSCRIPTION="ps/news/HEALTH/>" \ --network=spring-cloud-stream-solace-pubsub_default \ ivanfranchin/consumer-service:1.0.0
- It subscribes to all news related to
-
In a terminal, submit the following POST requests to producer-service
and check its logs and consumer-service
logs.
Note: HTTPie is being used in the calls bellow
-
Sending
news
one by one-
Just
consumer-service-1
should consumehttp :9080/api/news type="SPORT" country="BR" city="SaoPaulo" title="..."
-
Just
consumer-service-2
should consumehttp :9080/api/news type="HEALTH" country="PT" city="Porto" title="..."
-
Both
consumer-service-1
andconsumer-service-2
should NOT consumehttp :9080/api/news type="ECONOMY" country="DE" city="Berlin" title="..."
-
Both
consumer-service-1
andconsumer-service-2
should consumehttp :9080/api/news type="HEALTH" country="BR" city="Brasilia" title="..."
-
-
Sending a number of
news
randomly with a specified delay in secondshttp :9080/api/news/random number=10 delayInMillis=1000 --stream
-
Solace
Solace
can be accessed at http://localhost:8080 and enteradmin
to both username and password
- To stop applications, go to the terminals where they are running and press
Ctrl+C
; - To stop and remove docker-compose containers, network and volumes, go to a terminal and, inside
spring-cloud-stream-solace-pubsub
root folder, run the following command:docker compose down -v
In a terminal, make sure you are inside spring-cloud-stream-solace-pubsub
root folder
-
producer-service
./mvnw clean test --projects producer-service
-
consumer-service
./mvnw clean test --projects consumer-service
To remove the Docker images created by this project, go to a terminal and, inside spring-cloud-stream-solace-pubsub
root folder, run the following script:
./remove-docker-images.sh
The default Solace
SMF port 55555
is not working, at least in my Mac machine. The problem is explained in this issue. For now, I've changed the mapping port from 55555
to 55556
.