Search code examples
spring-mvcspring-bootjava-8rabbitmqspring-rabbit

How to retrieve List by a Consumer with Spring and rabbitmq


I have two projects

  1. WebApp(SpringMVC)
  2. Microservice

The idea is that I have a page in which I list all the users from DB, so basically I need a listener on WebApp side and a producer in the microservice side, typically the flow is as follow

Whitout rabbitmq(synchronous)

  1. Click page "List Users"
  2. UserController that redirect me to a specific service

    public List<User>getUsers(){//no args!!
       service.getUsers();//no args
    }
    
  3. UserService with logic to access DB and retrieve all users

    public List<User>getUsers(){//no args!!
       //connect to DB and retrieve all users
       return users
    }
    
  4. Render users on jsp

With RabbitMQ and assuming users has already been produced the list of users on the microservice's side

My question is about if I introduce rabbitmq then I need a method in which I listen a message(List of products as a JSON) but now the flow change a little bit comparing with the first one because

  1. Click button "List Users"
  2. Controller need a method findAll(Message message), here I need pass a message because the service is expecting one as the service is Listener

    public List<User>getUsers(Message message){
        service.getAllUsers(**String message**);
    }
    
  3. The service as right now is listen a message, I need to pass a Message arg in which I will be listen the queues

    @RabbitListener(queues = "${queue}", containerFactory = "fac")
    public List<User> getUsers(String message){
         //Transform JSON to POJO 
         //some logic...
         return users;
    
    }
    

    So basically my question is the second flow is correct?

    If so how I have to pass the Message object from controller to service because in controller I do not needed a Message, but in order to listen I have, is this correct?

    If so how pass the message arg

    There is a better way to achieve this?

    Regards


Solution

  • Use a Jackson2JsonMessageConverter and the framework will do all the conversion for you.

    Controller:

    List<User> users = template.convertSendAndReceiveAsType("someExchange", "someRoutingKey", 
        myRequestPojo, new ParameterizedTypeReference<List<User>>() {});
    

    Server:

    @RabbitListener(queues = "${queue}", containerFactory = "fac")
    public List<User> getUsers(SomeRequestPojo request){
         //some logic...
         return users;
    }
    

    Wire the converter into both the listener container factory and the RabbitTemplate.

    Request Pojo and Users have to be Jackson-friendly (no-arg constructor, setters).