Language: Java
Messaging/Queue
RabbitMQ, originally developed by Pivotal, is a popular message broker used in distributed systems, microservices, and event-driven architectures. The Java client allows developers to integrate RabbitMQ messaging capabilities into Java applications, supporting features like queues, exchanges, routing, acknowledgments, and transactions for reliable message delivery.
RabbitMQ Java Client is a Java library for interacting with RabbitMQ, a message broker that implements the Advanced Message Queuing Protocol (AMQP). It enables applications to send, receive, and process messages asynchronously and reliably.
Add dependency in pom.xml:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.18.0</version>
</dependency>Add dependency in build.gradle:
implementation 'com.rabbitmq:amqp-client:5.18.0'The library provides ConnectionFactory, Connection, Channel, and QueueingConsumer APIs to connect to RabbitMQ, declare queues, publish and consume messages, and manage exchanges and routing keys.
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
channel.queueDeclare("hello", false, false, false, null);
String message = "Hello RabbitMQ!";
channel.basicPublish("", "hello", null, message.getBytes());
System.out.println("Sent: " + message);
}Connects to RabbitMQ, declares a queue, and sends a simple message.
import com.rabbitmq.client.*;
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("hello", false, false, false, null);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println("Received: " + message);
};
channel.basicConsume("hello", true, deliverCallback, consumerTag -> {});Connects to RabbitMQ, listens on a queue, and prints received messages.
channel.exchangeDeclare("logs", "fanout");
String message = "Log message";
channel.basicPublish("logs", "", null, message.getBytes());Publishes a message to a fanout exchange, broadcasting to all bound queues.
boolean autoAck = false;
channel.basicConsume("task_queue", autoAck, (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println("Received: " + message);
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}, consumerTag -> {});Handles messages manually and acknowledges after processing to ensure reliability.
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().deliveryMode(2).build();
channel.basicPublish("", "task_queue", props, message.getBytes());Marks messages as persistent to survive RabbitMQ restarts.
Use persistent messages for critical data that should survive broker restarts.
Handle message acknowledgments properly to avoid message loss or duplication.
Use appropriate exchange types (direct, fanout, topic, headers) based on routing requirements.
Monitor queues and consumers to prevent bottlenecks and memory issues.
Use connection pooling or shared connections for efficiency in high-throughput systems.