rabbitmq - mqttv3

启用插件

启用插件之后,正常启动服务,mqtt 服务就部署上去了

# 启用插件
rabbitmq-plugins enable rabbitmq_mqtt

# rabbitmq 有个默认虚拟机(Virtual Hosts),名称为 "/", 这个要保留着,
# 使用 docker 部署的时候,如果指定了 RABBITMQ_DEFAULT_VHOST,则可能没这个虚拟机,
# 如果没有默认的队列,使用 MQTT 服务的时候,会报账号密码错误,
# 去管理界面,添加一个名称为 "/" 的队列即可。

Maven 依赖

<dependency>
	<groupId>org.eclipse.paho</groupId>
	<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
	<version>1.2.5</version>
</dependency>

关键参数

CleanSession 清除会话

设置为 false 之后,在 client 断线恢复之后,能接收到期间错过的消息。

注意磁盘空间和会话保持时间,避免磁盘空间不足,或者超时自动清除。

rabbitmq 的会话保持时间是一天,如果没有及时消费,超时之后,队列仍然会被清除。

Qos 服务质量

  • QoS 0:最多一次传输,消息可能会丢失。
  • QoS 1:至少一次传输,消息可能会重复。
  • QoS 2:仅一次传输,确保消息不会重复也不会丢失。

消息保留 retain

服务器会保留最新的一条 retain 值为 true 的消息(只有最后一条);

‌这个机制,可以确保当客户端连接到 MQTT 服务器时,可以立即获取队列最新状态。‌

代码样例

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

/**
 * 发生 MQTT 消息
 *
 * @author Mr.css
 * @version 2024-10-15 9:16
 */
public class MqttPublish {

    public static void main(String[] args) throws Exception {
        try {
            String topic = "mqtt";
            String broker = "tcp://localhost:1883";
            String clientId = "MqttPublish";

            MqttClient client = new MqttClient(broker, clientId);

            // 使用自定义参数连接
            MqttConnectOptions options = new MqttConnectOptions();
            options.setUserName("root");
            options.setPassword("root".toCharArray());
            options.setConnectionTimeout(60);
            options.setKeepAliveInterval(60);
			

			// 是否清理会话,这个配置非常重要,置为 false,client 可以获取到断线期间的消息
            options.setCleanSession(false);
            client.connect(options);

            String content = "Hello MQTT";
            MqttMessage message = new MqttMessage(content.getBytes());
            message.setQos(2);
            message.setRetained(false);

            client.publish(topic, message);
            System.out.println("send: " + message);

            client.disconnect();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}


import org.eclipse.paho.client.mqttv3.*;

/**
 * 接收 MQTT 消息
 *
 * @author Mr.css
 * @version 2024-10-15 9:16
 */
public class MqttReceiver implements MqttCallback {
    public static void main(String[] args) {
        try {
            String topic = "mqtt";
            String broker = "tcp://localhost:1883";
            String clientId = "MQTTReceiver";

            MqttClient client = new MqttClient(broker, clientId);
            MqttCallback callback = new MqttReceiver();

            client.setCallback(callback);


            // 使用自定义参数连接
            MqttConnectOptions options = new MqttConnectOptions();
            options.setUserName("root");
            options.setPassword("root".toCharArray());
            options.setConnectionTimeout(60);
            options.setKeepAliveInterval(60);
            client.connect(options);

            int qos = 2;
            client.subscribe(topic, qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void connectionLost(Throwable cause) {
        // 当连接丢失时调用
        System.out.println("Connection lost");
        cause.printStackTrace();
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // 当接收到消息时调用
        System.out.println("Message arrived: " + new String(message.getPayload()));
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        // 当消息发送成功时调用
        System.out.println("Delivery complete");
    }
}

posted on   疯狂的妞妞  阅读(23)  评论(0编辑  收藏  举报

(评论功能已被禁用)
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2020-10-31 poi - word合并单元格,拖动之后还原问题
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示