MQTT协议会话中消息重发的思路实现(个人理解)

MQTT协议会话中消息重发的思路实现(个人理解)

最近用netty写了一个mqtt服务器,基础功能基本实现。记录重发逻辑的理解

qos0消息发布流程图

在这里插入图片描述

qos1消息发布流程图

在这里插入图片描述

qos2消息发布流程图

在这里插入图片描述

MQTT协议会话中消息重发的思路实现(个人理解)

publish和pubrel的消息重发是针对订阅者而言的,重发是谁是发布者,才会担起这个责任,订阅者只是被动响应PUBACK、PUBREC或者PUBCOM

实现思路:

连接已连接状态:

​ 需要开启线程重发以下情况的消息:

1、没有收到puback、pubrec之前,要重发publish数据

​ 实现方案:出站write时就要开启周期性(假设设定每30s)重发任务,
​ 30s内收到puback、pubrec时(入站read),取消messageId对应的publish任务;

2、qos1的消息,第一种重发情况就已经解决;qos2收到pubrec时,发送pubrel。没有收到pubcom之前需要重发pubrel消息。

​ 实现方案:30s内收到pubrec时(入站read),取消对应的messageId的publish任务,
​ 要回复一个pubrel(出站write),同时开启周期性任务重发pubrel任务(假设设定每30s)
​ 30s内收到pubcom时(入站read),取消messageId对应的pubrel任务。
​ ps:所以收到pubrec后续只会重发pubrel消息,也就是说是不是收到pubrec之后就可以删除原来的publish本体消息了?或者保留下来没收到pubcom之前用作其他的用途。比如,需要msgId用完需要可重用,用作判断依据,所以我选择不删除。但收到pubcom消息时必须保证删除。

连接已断开状态(下次连接):

​ clearSession=1,清除对应客户端所有的会话历史消息
​ clearSession=0,下一次重连,publish、pubrel消息直接发送,重走注册周期性任务流程;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,常用于物联网设备之间的通信。在Java,可以使用Eclipse Paho库来实现MQTT协议消息推送。 首先,你需要在项目引入Eclipse Paho库的依赖。可以在Maven项目的pom.xml文件添加以下依赖: ```xml <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> ``` 接下来,你可以使用以下代码实现MQTT协议消息推送: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttPublisher { public static void main(String[] args) { String broker = "tcp://mqtt.eclipse.org:1883"; // MQTT broker地址 String clientId = "JavaPublisher"; // 客户端ID String topic = "test/topic"; // 发布的主题 int qos = 1; // 消息质量 try { MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence()); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); System.out.println("Connecting to broker: " + broker); client.connect(connOpts); System.out.println("Connected"); String content = "Hello, MQTT!"; MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(qos); System.out.println("Publishing message: " + content); client.publish(topic, message); System.out.println("Message published"); client.disconnect(); System.out.println("Disconnected"); } catch (MqttException e) { e.printStackTrace(); } } } ``` 上述代码,我们创建了一个MqttClient对象,并指定了MQTT broker的地址、客户端ID、发布的主题和消息质量。然后,我们连接到MQTT broker,发布一条消息,最后断开连接。 请注意,上述代码仅为示例,你需要根据实际情况修改broker地址、客户端ID、主题和消息内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值