#1
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