GithubHelp home page GithubHelp logo

ivangfr / spring-cloud-stream-solace-pubsub Goto Github PK

View Code? Open in Web Editor NEW
0.0 2.0 3.0 246 KB

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.

Java 98.11% Shell 1.89%
spring-boot solace-pubsub spring-cloud-stream java docker jib webflux

spring-cloud-stream-solace-pubsub's Introduction

spring-cloud-stream-solace-pubsub

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.

Proof-of-Concepts & Articles

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.

Additional Readings

Applications

  • producer-service

    Spring Boot application that exposes a REST API to submit news 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": ...}
    
  • consumer-service

    Spring Boot application that consumes the news events published by producer-service.

Prerequisites

Start Environment

  • 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
    

Running Applications with Maven

  • 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
      
  • 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
      
  • 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
      

Running Applications as Docker containers

  • Build Docker Images

    • 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
        
  • Environment Variables

    • producer-service

      Environment Variable Description
      SOLACE_HOST Specify host of the Solace PubSub+ message broker to use (default localhost)
      SOLACE_PORT Specify port of the Solace PubSub+ message broker to use (default 55556)
    • consumer-service

      Environment Variable Description
      SOLACE_HOST Specify host of the Solace PubSub+ message broker to use (default localhost)
      SOLACE_PORT Specify port of the Solace PubSub+ message broker to use (default 55556)
  • Run Docker Containers

    • 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
        
    • 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
        

Playing around

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 consume

      http :9080/api/news type="SPORT" country="BR" city="SaoPaulo" title="..."
      
    • Just consumer-service-2 should consume

      http :9080/api/news type="HEALTH" country="PT" city="Porto" title="..."
      
    • Both consumer-service-1 and consumer-service-2 should NOT consume

      http :9080/api/news type="ECONOMY" country="DE" city="Berlin" title="..."
      
    • Both consumer-service-1 and consumer-service-2 should consume

      http :9080/api/news type="HEALTH" country="BR" city="Brasilia" title="..."
      
  • Sending a number of news randomly with a specified delay in seconds

    http :9080/api/news/random number=10 delayInMillis=1000 --stream
    

Useful Links

Shutdown

  • 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
    

Running Test Cases

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
    

Cleanup

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

References

Issues

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.

spring-cloud-stream-solace-pubsub's People

Watchers

 avatar  avatar

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.