HiveMQ Community Edition: Broker MQTT 100% Java
Fala pessoal, tudo bem?
Depois de explorarmos o Eclipse Mosquitto em outro post do blog (https://www.gasparbarancelli.com/post/eclipse-mosquitto-e-graalvm-broker-mqtt-e-java-nativo-para-iot), vamos agora dar uma olhada em outra grande alternativa de broker MQTT: o HiveMQ Community Edition. O HiveMQ é reconhecido por sua alta escalabilidade, robustez e por ser 100% escrito em Java — o que facilita bastante sua extensão e customização. Nesta postagem, vou mostrar como subir o HiveMQ Community via Docker, além de reutilizar nossa mesma aplicação Java (Publisher e Subscriber) usando Eclipse Paho. E, claro, compilando com GraalVM para gerar binários nativos que têm startup rápido e baixo consumo de memória.
Para conferir um exemplo completo do código usado neste post, acesse o repositório oficial: https://github.com/gasparbarancelli/demo-mqtt/tree/hivemq
O que é o HiveMQ Community Edition?
O HiveMQ é um broker MQTT de alta qualidade, muito usado em aplicações de IoT, soluções em nuvem e cenários com alto volume de mensagens. A Community Edition (CE) é uma versão gratuita e open source que traz um conjunto sólido de recursos:
-
100% Java: todo o core do HiveMQ é escrito em Java, tornando-o extremamente compatível com soluções já baseadas nesse ecossistema.
-
Escalabilidade: O HiveMQ (na versão comercial/enterprise) suporta clustering e distribui conexões entre vários nós. Já a Community Edition, mesmo sem cluster nativo, consegue lidar com uma boa quantidade de conexões e mensagens.
-
Facilidade de extensões: Por ser Java, é simples criar plugins ou extensões que integrem com sistemas de monitoramento, bancos de dados ou outros serviços.
-
Alinhado ao protocolo MQTT 3.x e 5: HiveMQ se mantém atualizado com as últimas versões do protocolo MQTT, garantindo suporte aos recursos mais recentes.
-
Suporte a TLS: Permite configurar conexões seguras por TLS/SSL sem complicações, fundamental em ambientes corporativos e projetos de IoT críticos.
Subindo o HiveMQ Community via Docker
Assim como fizemos com o Mosquitto, podemos facilmente rodar o HiveMQ Community Edition em um contêiner Docker. A HiveMQ mantém uma imagem oficial no Docker Hub.
docker-compose.yml (exemplo básico)
Abaixo, um exemplo de docker-compose.yml
para subir o HiveMQ Community:
version: '3' services: hivemq-ce: image: hivemq/hivemq-ce container_name: hivemq-ce ports: - "1883:1883" restart: unless-stopped
-
1883 é a porta padrão MQTT
Para iniciar o container:
docker-compose up -d
Em seguida, o HiveMQ CE estará disponível para conexões MQTT em tcp://localhost:1883
.
Aplicação Java (Publisher + Subscriber) com Eclipse Paho
Para manter a consistência, vamos reutilizar nossa aplicação Java de exemplo.
Configuração do Maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gasparbarancelli</groupId>
<artifactId>demo-mqtt</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>23</maven.compiler.source>
<maven.compiler.target>23</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<imageName>publisher</imageName>
<mainClass>com.gasparbarancelli.Publisher</mainClass>
</properties>
<dependencies>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.10.4</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>${mainClass}</mainClass>
<imageName>${imageName}</imageName>
</configuration>
</plugin>
</plugins>
</build>
</project>
Exemplo de Publisher
package com.gasparbarancelli;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class Publisher {
private static final String BROKER_URL = "tcp://localhost:1883";
private static final String TOPIC = "test/topic";
private static final String CLIENT_ID = "PublisherExampleHiveMQ";
public static void main(String[] args) {
try {
MqttClient client = new MqttClient(BROKER_URL, CLIENT_ID, new MemoryPersistence());
client.connect();
String mensagem = "Olá, HiveMQ! Mensagem de teste via MQTT (Community Edition).";
if (args.length > 0) {
mensagem = String.join(" ", args);
}
MqttMessage mqttMessage = new MqttMessage(mensagem.getBytes());
mqttMessage.setQos(1);
client.publish(TOPIC, mqttMessage);
System.out.println("Mensagem publicada para " + TOPIC + ": " + mensagem);
client.disconnect();
client.close();
} catch (MqttException e) {
e.printStackTrace();
}
}
}
Exemplo de Subscriber
package com.gasparbarancelli;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class Subscriber implements MqttCallback {
private static final String BROKER_URL = "tcp://localhost:1883";
private static final String TOPIC = "test/topic";
private static final String CLIENT_ID = "SubscriberExampleHiveMQ";
public static void main(String[] args) {
new Subscriber().startSubscriber();
}
public void startSubscriber() {
try {
MqttClient client = new MqttClient(BROKER_URL, CLIENT_ID, new MemoryPersistence());
client.setCallback(this);
client.connect();
client.subscribe(TOPIC, 1);
System.out.println("Assinado no tópico: " + TOPIC);
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
public void connectionLost(Throwable cause) {
System.out.println("Conexão perdida: " + cause.getMessage());
}
@Override
public void messageArrived(String topic, MqttMessage message) {
System.out.println("Mensagem recebida. Tópico: " + topic + ", Mensagem: " + new String(message.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// Chamado quando a publicação é confirmada
}
}
Com isso, você já consegue publicar e receber mensagens via HiveMQ Community.
Compilando em Nativo com GraalVM
Assim como no exemplo anterior (Mosquitto), podemos usar a GraalVM para compilar essas classes em binários nativos, obtendo:
-
Startup instantâneo (na casa de milissegundos)
-
Menor consumo de memória em comparação com uma aplicação Java tradicional rodando em JVM
Execute os comandos a seguir para gerar o executável nativo
mvn package -Pnative -DmainClass=com.gasparbarancelli.Subscriber -DimageName=subscriber
mvn package -Pnative -DmainClass=com.gasparbarancelli.Publisher -DimageName=publisher
Execute os binários gerados em target/
.
Inicie o executável responsável por ouvir as mensagens:
./subscriber
Execute os seguintes comandos para enviar mensagens:
./publisher
./publisher gasparbarancelli.com
./publisher 'Feliz Natal!!!'
Benefícios do HiveMQ Community
-
100% Java: Facilita a extensibilidade, pois você pode criar plugins personalizados em Java, integrando com serviços e bancos de dados.
-
Alto desempenho: Projetado para lidar com grandes quantidades de conexões e mensagens, mesmo na versão Community.
-
Compatibilidade: Suporta as versões mais recentes do protocolo MQTT (3.x e 5), garantindo que dispositivos atuais e futuros funcionem perfeitamente.
-
Documentação e comunidade: Há uma boa base de artigos e suporte, além da versão Enterprise caso você precise de clustering e outros recursos avançados.
-
Fácil de administrar: Com a opção de gerenciar o broker via Docker, fica simples escalar e fazer deploy em diferentes ambientes.
Conclusão
O HiveMQ Community Edition se destaca por ser 100% Java, escalável e fácil de estender, oferecendo ainda suporte ao MQTT 3.x e MQTT 5, o que o torna uma opção sólida para quem precisa de um broker confiável e pronto para crescer com o projeto. Quando aliado à GraalVM para gerar binários nativos de suas aplicações Publisher e Subscriber (usando o Eclipse Paho), você ganha em velocidade de inicialização e eficiência no uso de recursos, algo fundamental em projetos IoT e sistemas de grande porte.
Então, se você está procurando um broker MQTT robusto, personalizável e já alinhado com ecossistemas Java, o HiveMQ Community Edition vale muito a pena experimentar. Boa sorte nos seus projetos de IoT!