【发布时间】:2015-01-10 16:29:16
【问题描述】:
我一直在阅读this 教程来学习Paho android Service API 的基础知识,并且在我读到的文本中的一些地方client.connect(context, callback 有两种方法onSuccess() 和onFailure()
如前所述,此示例中使用了同步客户端(MqttClient 与 MqttAsyncClient 相对)。这意味着请求,如连接,将阻塞并返回或抛出异常。没有轮询或读取方法从服务器获取消息,来自服务器的消息可以随时到达。该库提供了一个回调机制来处理此行为,向客户端注册的 MqttCallback 对象中的方法将被适当地调用。 MqttCallback 是一个必须由另一个类实现的接口...要启用回调功能,需要向客户端注册一个回调对象,从逻辑上讲,这将在连接到服务器之前完成
在阅读了我提到的最后两行之后,我感到困惑。因为据我了解,让客户端注册到 hasconnectionLost,deliveryComplete,messageArrived 的回调的本质是“异步”处理服务器状态并阅读从服务器。
现在,我的问题是,关于我引用的最后两行,我应该如何注册客户端以在连接到服务器本身之前从服务器读取状态?或者换句话说,“为什么,“client.callback”应该在“client.connect()”之前调用?”
任何人都可以澄清和解释这一点。
【问题讨论】:
-
我不能假装自己是 MQTT 专家,但我所做的就是遵循本教程 dalelane.co.uk/blog/?p=1599 并实现我自己的客户端。它确实有你必须修复的错误并且有点过时,但我认为它很好地解释了这些概念并且有一个半(90%)的工作代码库你可以查看以了解幕后发生的事情。
-
感谢您的回答。但我只想知道为什么,“client.callback”应该在“client.connect()”之前调用?
-
啊。我认为这意味着您在实际 connet() 之前注册回调,因此如果有任何未决通知,您不会在 connect() 和正在注册和调用的回调之间错过它们。假设您有一个待处理的通知。在第 (1) 行你有 connect() 和第 (2) 行你注册了回调。由于异步性质,在连接和注册回调之间(第 1 行和第 2 行之间),您可能会错过待处理的通知。至少我是这么理解的。
-
关键是,在您连接和订阅以及注册回调之间,可能会收到一条消息,这就是为什么他们建议您在连接之前注册回调处理程序,以防在队列。 MQQT(至少超过 ActiveMQ)与任何其他排队系统一样。如果您查看 MQQT 服务器,您会发现您将某些内容发布到“主题”。您可以将此主题视为一个 MQ(消息队列),您的服务器将内容放入其中,您的客户端使用它们...(续)
-
如果没有消费者(即发即弃),您的服务器可以轻松地将消息放在该主题上,或者可以选择保留消息直到它们被传递(跟踪传递给已知客户端, 等等。)。在这两种情况下,您都可以连接并立即收到有关您刚刚连接和订阅的主题的内容,然后才有机会注册回调,因此在连接之前注册回调更安全。
标签: android mqtt messagebroker paho