接收离线消息

环境信息

  • EMQ X 版本:3.1.1
  • 操作系统及版本:
  • 其他

问题描述

想接收离线消息,设置Qos为1,cleanSession:false,但是每次接收到的离线消息都是32条,在一次启动程序依旧只是接收32条缓存数据,没有将缓存中数据一次性全拉下来

配置文件及日志

你说的离线消息指的应该是持久会话中缓存的消息吧?是每次重连都只收到更新的32条消息吗?我这边没有复现,建议你可以抓包看一下,所有缓存的报文应该都是在重连时一次性发出的。

对,持久会话的缓存消息。每次收到的消息都是32条,在上线收到的消息是往后的32条,但是还收到32条信息,没有一次性行缓存中拉取

这个帖子 描述的详细一点

可以看到,你的客户端每次重连时 EMQ X 下发的消息数量都等于最大飞行窗口的大小,由于你是 QoS 1 消息,所以当一次性下发的消息数量达到最大飞行窗口大小时,就必须等到收到客户端的应答报文,才会继续下发剩下的报文。

这个应答报文是所传数据的报文,还是?有样例吗。我应该怎么传应答报文给服务端

并且每次离线在接收的数据不一样,说明之前飞行窗口的数据已经进行了消费了吧,现在飞行窗口不能滑动,是不是因为当消费完最大窗口数,没有返回应答信息给服务端。那这个我应该怎么做

QoS 1 的应答报文是 PUBACK,一般是你使用的客户端库底层自行完成的。只要你的客户端保持连接,其实这些消息都是会被陆续消费的,只不过是因为飞行窗口的限制,不会一次性就把所有的报文都发出去。

你能够不断消费新的消息的话,说明之前的消息肯定有被应答了,只不过因为当前消息队列中一直有消息,飞行窗口刚小下来,EMQ X 就立即从消息队列中取出消息下发了,所以飞行窗口就又满了,所以飞行窗口看起来没有变化。具体你可以看下这篇文档:飞行窗口和消息队列 | EMQ Docs

陆续消费的意思是有时间机制,这个时间机制我调成了5秒,但是后续的离线消息并没有返回客户端。现在就是想请问一下,我应该怎么做使得窗口滑动。

我就想能获取到所有的离线消息,但是很明显飞行窗口没有滚动,在这之前有上截图,所有离线消息也已经有入队,但是飞行窗口不滑动导致消费不了。我个人认为主要问题是飞行窗口不滑动导致接收不到后续的离线消息

但是不知道解决这一问题的办法

你好,请问问题是否已经解决?