我一直在阅读 Paho 异步 MQTT 库的文档 https://eclipse.github.io/paho.mqtt.c/MQTTAsync/html/index.html 我不太清楚是否也阻塞定义的 MQTTAsync_messageArrived 回调中的 long 将导致消息丢失或在另一个线程上缓冲。
此页面上的所有内容(https://eclipse.github.io/paho.mqtt.c/MQTTAsync/html/async.html)是“握手和维护网络连接的处理在后台执行” ”。这听起来像是能够维持与代理的连接,但尚不清楚这是否还包括主题的接收。
我看到 MQTTAsync_createOptions 中有一个用于最大缓冲消息的值,但据我所知,这是用于发布消息而不是接收消息的缓冲区。还是两者兼而有之?
我是否可以安全地阻止此消息到达回调,或者我是否需要在自己的线程上使用某种生产者/消费队列,以便不会错过任何消息?
您永远不应该在
messageArrived
回调中运行阻塞长时间运行的任务。如果您有长时间运行的任务,您应该将它们交给单独的线程
该库包含一个线程,用于从套接字读取传入数据包,并从该线程调用
messageArrived()
。因此,如果您阻止该线程,则会阻止所有输入处理。所以不要长时间阻塞该线程。
如果您想缓冲传入消息,最好将它们写入线程安全队列,以便在时间允许时由应用程序使用。
你的怀疑是正确的。
maxBufferedMessages
用于出站(发布)流量。它允许您的应用程序在与代理断开连接时“发布”消息。这些将保存在 FIFO 中,并在重新建立连接时按顺序自动发送。
文档对此的评论不够清楚。可以更新一下。