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");
}
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
分类:
message-queue
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2020-10-31 poi - word合并单元格,拖动之后还原问题