我一直在阅读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中有一个值用于最大缓冲消息,但据我所知,这是一个用于发布消息而不是接收消息的缓冲区。还是两者都有?
我是否可以安全地在这个消息到达回调中潜在地阻塞,或者我是否需要在我自己的线程上利用某种生产者/消费者队列,以便没有消息被错过?
2条答案
按热度按时间zbdgwd5y1#
永远不要在
messageArrived
回调中运行阻塞的长时间运行的任务。如果你有长时间运行的任务,你应该把它们交给一个单独的线程yshpjwxd2#
该库包含一个线程,用于从套接字阅读传入的数据包,并从该线程调用
messageArrived()
。因此,如果您阻塞了该线程,那么您就阻塞了所有的输入处理。所以不要长时间阻塞线程。如果要缓冲传入消息,最好将它们写入线程安全队列,以便在时间允许时由应用程序使用。
你的怀疑是正确的。
maxBufferedMessages
用于出站(发布)流量。它允许您的应用程序在与代理断开连接时“发布”消息。它们将保存在FIFO中,并在重新建立连接时按顺序自动发送。医生对这一点的评论不够清楚。它可以被更新。