Setting up MQTT in Quarkus can be straightforward when leveraging Docker for development and Kubernetes for production. This guide walks you through configuring MQTT using
application.properties
, ensuring a smooth transition from local development to a production environment.
1. Adding Necessary Dependencies
To begin, include the required dependencies in your
pom.xml
:
<dependencies>
<!--MQTT Connector-->
<dependency>
<groupid>io.smallrye.reactivelt;/groupid>
<artifactid>smallrye-reactive-messaging-mqttlt;/artifactid>
</dependency>
<!--Kubernetes Config Extension-->
<dependency>
<groupid>io.quarkuslt;/groupid>
<artifactid>quarkus-kubernetes-configlt;/artifactid>
</dependency>
</dependencies>
The MQTT connector facilitates communication with the MQTT broker, while the Kubernetes Config extension allows your application to read configurations from Kubernetes ConfigMaps and Secrets.
quarkus.io
2. Development Environment Configuration (application-dev.properties
)
For local development, you can run an MQTT broker using Docker. Here's how to set up Eclipse Mosquitto:
docker run -d --name mqtt-dev \
-p 1883:1883 \
eclipse-mosquitto
In your
application-dev.properties
, configure the MQTT connection:
%dev.mp.messaging.incoming.mqtt-channel.connector=smallrye-mqtt
%dev.mp.messaging.incoming.mqtt-channel.host=localhost
%dev.mp.messaging.incoming.mqtt-channel.port=1883
%dev.mp.messaging.incoming.mqtt-channel.topic=dev/topic
%dev.mp.messaging.incoming.mqtt-channel.client-id=quarkus-dev-client
This setup connects your Quarkus application to the locally running MQTT broker.
3. Production Environment Configuration (application-prod.properties
)
In a production environment, especially when deploying to Kubernetes, it's best to externalize configurations using ConfigMaps and Secrets.
Create a ConfigMap for MQTT settings:
apiVersion: v1
kind: ConfigMap
metadata:
name: mqtt-config
data:
mqtt.host: mqtt-broker
mqtt.port: "1883"
mqtt.topic: prod/topic
Create a Secret for sensitive information:
apiVersion: v1
kind: Secret
metadata:
name: mqtt-secret
type: Opaque
data:
mqtt.username: cHJvZHVzZXI= # base64 for 'produser'
mqtt.password: cHJvZHBhc3M= # base64 for 'prodpass'
Configure your application-prod.properties
:
%prod.mp.messaging.incoming.mqtt-channel.connector=smallrye-mqtt
%prod.mp.messaging.incoming.mqtt-channel.host=${mqtt.host}
%prod.mp.messaging.incoming.mqtt-channel.port=${mqtt.port}
%prod.mp.messaging.incoming.mqtt-channel.topic=${mqtt.topic}
%prod.mp.messaging.incoming.mqtt-channel.username=${mqtt.username}
%prod.mp.messaging.incoming.mqtt-channel.password=${mqtt.password}
%prod.mp.messaging.incoming.mqtt-channel.client-id=quarkus-prod-client
Enable Kubernetes Config in your application:
%prod.quarkus.kubernetes-config.enabled=true
%prod.quarkus.kubernetes-config.config-maps=mqtt-config
%prod.quarkus.kubernetes-config.secrets=mqtt-secret
This configuration allows your Quarkus application to retrieve MQTT settings from Kubernetes resources.
4. Switching Between Profiles
Quarkus supports configuration profiles, enabling you to switch between different environments seamlessly.
Activate the development profile:
./mvnw quarkus:dev -Dquarkus.profile=dev
For production, set the profile accordingly:
java -Dquarkus.profile=prod -jar target/quarkus-app/quarkus-run.jar
By specifying the profile, Quarkus loads the corresponding configurations from
application.properties
.
image quote pre code