HiveMQ Community Edition: Broker MQTT 100% Java

Por Gaspar Barancelli Junior em 25 de dezembro de 2024

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:

  1. 100% Java: todo o core do HiveMQ é escrito em Java, tornando-o extremamente compatível com soluções já baseadas nesse ecossistema.

  2. 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.

  3. 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.

  4. 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.

  5. 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!

// Compartilhe esse Post

💫
🔥 NOVO APP

Domine o Inglês em 30 dias!

Inteligência Artificial + Repetição Espaçada • Método cientificamente comprovado

✅ Grátis para começar 🚀 Resultados rápidos
×