Paho MQTT异步C客户端是否缓冲接收到的消息?

5jdjgkvh  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(254)

我一直在阅读Paho异步MQTT库https://eclipse.github.io/paho.mqtt.c/MQTTAsync/html/index.html的文档,我不太清楚在定义的MQTTASync_messageArrived回调中阻塞太长时间是否会导致消息丢失,或者它们是否在另一个线程上缓冲。
在这个页面(https://eclipse.github.io/paho.mqtt.c/MQTTAsync/html/async.html)上所说的是“握手和维护网络连接的处理是在后台执行的”。这使得它听起来像是能够保持与代理的连接,但不清楚这是否也包括接收主题。
我看到MQTTASync_createOptions中有一个值用于最大缓冲消息,但据我所知,这是一个用于发布消息而不是接收消息的缓冲区。还是两者都有?
我是否可以安全地在这个消息到达回调中潜在地阻塞,或者我是否需要在我自己的线程上利用某种生产者/消费者队列,以便没有消息被错过?

zbdgwd5y

zbdgwd5y1#

永远不要在messageArrived回调中运行阻塞的长时间运行的任务。如果你有长时间运行的任务,你应该把它们交给一个单独的线程

yshpjwxd

yshpjwxd2#

该库包含一个线程,用于从套接字阅读传入的数据包,并从该线程调用messageArrived()。因此,如果您阻塞了该线程,那么您就阻塞了所有的输入处理。所以不要长时间阻塞线程。
如果要缓冲传入消息,最好将它们写入线程安全队列,以便在时间允许时由应用程序使用。
你的怀疑是正确的。maxBufferedMessages用于出站(发布)流量。它允许您的应用程序在与代理断开连接时“发布”消息。它们将保存在FIFO中,并在重新建立连接时按顺序自动发送。
医生对这一点的评论不够清楚。它可以被更新。

相关问题