RabbitMQ is a reliable and widely used message broker that supports multiple messaging protocols, making it a great choice for microservices communication. Quarkus, known for its fast startup and cloud-native capabilities, integrates well with RabbitMQ—especially when configured using
application.properties
and Spring-like messaging patterns.
This guide will walk you through setting up RabbitMQ in Quarkus using Docker for local development and Kubernetes for production, all while keeping your configuration clean and environment-specific with
application-dev.properties
and
application-prod.properties
.
Step 1: Add Required Dependencies
To start, make sure your Quarkus project includes the necessary dependencies in your
pom.xml
. For RabbitMQ, you’ll typically use the AMQP connector provided by the SmallRye Reactive Messaging extension.
<dependencies>
<!-- RabbitMQ via AMQP connector -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-reactive-messaging-amqp</artifactId>
</dependency>
<!-- Kubernetes Config support -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-config</artifactId>
</dependency>
</dependencies>
These provide everything needed to connect your Quarkus app to RabbitMQ and allow Kubernetes-based configuration for production.
Step 2: Run RabbitMQ Using Docker for Development
For a fast and simple local RabbitMQ instance, use Docker:
docker run -d --hostname rabbit-dev --name rabbitmq-dev \
-p 5672:5672 -p 15672:15672 rabbitmq:3-management
- The message broker listens on port
5672
.
- The management UI is available on
http://localhost:15672
with default credentials (guest
/ guest
).
Step 3: Configure application-dev.properties
Now create a file named
application-dev.properties
in
src/main/resources
:
# Quarkus profile-specific settings
%dev.mp.messaging.incoming.rabbit-queue.connector=smallrye-amqp
%dev.mp.messaging.incoming.rabbit-queue.address=dev-queue
%dev.mp.messaging.incoming.rabbit-queue.host=localhost
%dev.mp.messaging.incoming.rabbit-queue.port=5672
%dev.mp.messaging.incoming.rabbit-queue.username=guest
%dev.mp.messaging.incoming.rabbit-queue.password=guest
%dev.mp.messaging.outgoing.rabbit-out.connector=smallrye-amqp
%dev.mp.messaging.outgoing.rabbit-out.address=dev-queue
%dev.mp.messaging.outgoing.rabbit-out.host=localhost
%dev.mp.messaging.outgoing.rabbit-out.port=5672
%dev.mp.messaging.outgoing.rabbit-out.username=guest
%dev.mp.messaging.outgoing.rabbit-out.password=guest
To use this profile when running your app:
./mvnw quarkus:dev -Dquarkus.profile=dev
Step 4: Prepare for Production with Kubernetes
In production, you don’t want to hardcode connection values or credentials. Kubernetes lets you externalize these via ConfigMaps and Secrets.
Step 4.1: Create a ConfigMap for RabbitMQ Settings
apiVersion: v1
kind: ConfigMap
metadata:
name: rabbitmq-config
data:
rabbitmq.host: rabbitmq-service
rabbitmq.port: "5672"
rabbitmq.queue: prod-queue
Step 4.2: Create a Secret for Credentials
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-secret
type: Opaque
data:
rabbitmq.username: cHJvZHVzZXI= # base64 for 'produser'
rabbitmq.password: cHJvZHBhc3M= # base64 for 'prodpass'
Step 5: Configure application-prod.properties
Now, set up your production configuration using environment variable placeholders:
%prod.mp.messaging.incoming.rabbit-queue.connector=smallrye-amqp
%prod.mp.messaging.incoming.rabbit-queue.address=${rabbitmq.queue}
%prod.mp.messaging.incoming.rabbit-queue.host=${rabbitmq.host}
%prod.mp.messaging.incoming.rabbit-queue.port=${rabbitmq.port}
%prod.mp.messaging.incoming.rabbit-queue.username=${rabbitmq.username}
%prod.mp.messaging.incoming.rabbit-queue.password=${rabbitmq.password}
%prod.mp.messaging.outgoing.rabbit-out.connector=smallrye-amqp
%prod.mp.messaging.outgoing.rabbit-out.address=${rabbitmq.queue}
%prod.mp.messaging.outgoing.rabbit-out.host=${rabbitmq.host}
%prod.mp.messaging.outgoing.rabbit-out.port=${rabbitmq.port}
%prod.mp.messaging.outgoing.rabbit-out.username=${rabbitmq.username}
%prod.mp.messaging.outgoing.rabbit-out.password=${rabbitmq.password}
%prod.quarkus.kubernetes-config.enabled=true
%prod.quarkus.kubernetes-config.config-maps=rabbitmq-config
%prod.quarkus.kubernetes-config.secrets=rabbitmq-secret
Step 6: Activate the Production Profile in Kubernetes
In your app’s Kubernetes Deployment manifest, set the environment variable to activate the
prod
profile:
env:
- name: QUARKUS_PROFILE
value: prod
Quarkus will use the
application-prod.properties
file automatically.
Step 7: Validate RabbitMQ Integration
You can test the connection by injecting and using
Emitter
in a REST endpoint:
import jakarta.inject.Inject;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import org.eclipse.microprofile.reactive.messaging.Channel;
import org.eclipse.microprofile.reactive.messaging.Emitter;
@Path("/send")
public class RabbitMQSender {
@Inject
@Channel("rabbit-out")
Emitter<String> emitter;
@POST
public void send(String message) {
emitter.send(message);
}
}
Call
/send
with a test message, and check your RabbitMQ dashboard to verify delivery.
image quote pre code