RabbitMQ – How to send/receive Java object messages with Spring RabbitMq | SpringBoot

In the previous posts, Spring RabbitMQ applications had produced/consumed String messages. Today, JavaSampleApproach will guide how to send/receive Java object messages with RabbitMQ server.

Related posts:
RabbitMq – How to create Spring RabbitMq Publish/Subcribe pattern with SpringBoot
RabbitMQ – How to create Spring RabbitMQ Producer/Consumer applications with SpringBoot

I. Technologies

– Java 8
– Maven 3.6.1
– Spring Tool Suite: Version 3.8.4.RELEASE
– Spring Boot: 1.5.4.RELEASE
– RabbitMQ

II. RabbitMq – Produce/consume Java object messages

In the tutorial, we create 2 SpringBoot applications {Producer, Consumer} for sending/receiving Java object messages to/from RabbitMQ:

Spring RabbitMq - Send Java Objects - architecture

1. Message Converter

We create a simple Java model:

Then send a Company object to RabbitMQ by segment code:

And receiving it from Consumer by segment code:

-> Got Exception:

How to resolve it? -> We need a MessageConverter for Producer and Consumer:

– Producer: set MessageConverter for rabbitTemplate

– Consumer: set MessageConverter for listenerContainerFactory

2. Bi-Directional Java object messages

Now we change models with more complex structure – Bi-Directional relationship:

– Company:

– Product

Init a Company object as below:

Then send a message to RabbitMQ again:

-> We got an Infinite recursion (StackOverflowError) exception:

Why? -> Beacause of the Bidirectional-Relationships between Company object and Product objects.

-> Solution:
We have can refer solutions at How to resolve Json Infinite Recursion problem when working with Jackson.

For preserving Bidirectional-Relationships when deserialize Json strings to Java objects, we can choose a solution with @JsonIdentityInfo, details as below code:

– Company

– Produce

III. Practice

We create 2 SpringBoot projects {Producer, Consumer}:

Spring RabbitMq - Send Java Objects - project structures

Step to do:
– Create SpringBoot projects
– Create Java models
– Create RabbitMq configuration
– Implement RabbitMq producer/consumer
– Implement sending client
– Run and check results

1. Create SpringBoot projects

Create 2 SpringBoot projects {Producer, Consumer}, then add dependency:

2. Create Java models

– Company:

– Product

3. Create RabbitMq Configuration

For each projects, open application.properties file, configure spring.rabbitmq.*:

For logging in file, under /src/main/resources folder, create a logback-spring.xml file:

3.1 Producer Config

– Create a RabbitMqConfig:

Note: we create 3 bean {Queue, DirectExchange, Binding} for automatically creating a direct RabbitMq exchange, a queue and binding them together.

3.2 Consumer Config

– Create a RabbitMqConfig:

4. Implement RabbitMq Producer/Consumer
4.1 Implement Producer

4.2 Consumer

5. Implement Sending Client

In SpringBoot main class, use CommandLineRunner to implement a client for producer:

6. Run and check results

Build and run the SpringBoot projects {Producer, Consumer} with commandlines: mvn clean install, mvn spring-boot:run.

– Go to http://localhost:15672/#/exchanges/%2F/jsa.exchange
-> Checking the automatically creating and binding of RabbitMq exchange jsa.exchange and queue jsa.queue with routingKey jsa.routingkey:

Spring RabbitMq - Send Java Objects - exchange binding with queue

– Checking console logs:
-> From Producer: ‘Send msg = {"name":"Apple","products":[{"name":"Iphone 7"},{"name":"IPadPro"}]}
-> From Consumer: ‘Recieved Message: {"name":"Apple","products":[{"name":"Iphone 7"},{"name":"IPadPro"}]}

IV. Sourcecode


Related Posts

Got Something To Say:

Your email address will not be published. Required fields are marked *