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!