程序在MQTT Java中使用QoS = 0发布消息时悬挂



我正在thingtream中的MQTT客户端工作。当我尝试使用QoS = 0向主题发布消息时,发送消息是发送,但程序仅挂在此处。然后,我尝试使用QoS = 1发送消息。消息已成功发送,并且程序也没有挂起。但是,在发送另一个消息时,我会得到中断异常。谁能帮我吗。

以下是我用来发布消息的片段。

MqttMessage message = new MqttMessage(command);
message.setPayload(command);
message.setQos(1);
mqttClient.publish(topic, message);
System.out.println("Message published");

库使用的库-org.eclipse.paho.client.mqttv3-1.2.0

初始化MQTT客户端的代码

public void connect() {
    try {
        mqttClient = new MqttClient(serverUri, clientId);
        //mqttClient.setTimeToWait(10000);
    } catch (MqttException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    mqttClient.setCallback(new MqttCallbackExtended() {
        @Override
        public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("messageArrived: " + topic.toString());
            System.out.println(mqttMessage.toString());
            System.out.println(mqttMessage.getPayload());
        }
        @Override
        public void deliveryComplete(IMqttDeliveryToken arg0) {
            // TODO Auto-generated method stub
            System.out.println("deliveryComplete: " + arg0.getMessageId());
        }
        @Override
        public void connectionLost(Throwable arg0) {
            // TODO Auto-generated method stub
            System.out.println("---Connection lost1");
            // Toast.makeText(App.getContext(), "Connection
            // lost",Toast.LENGTH_SHORT).show();
        }
        @Override
        public void connectComplete(boolean arg0, String arg1) {
            // TODO Auto-generated method stub
            System.out.println("connectComplete");
            try {
                mqttClient.subscribe("device/+/publish");
            } catch (MqttException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                commands.sendCommand(Commands.GET_STATUS, null, "device/identity:85111741-5789-3010-85c9-be4a7204e5d3");
            } catch (MqttException | InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
    mqttConnectOptions.setAutomaticReconnect(true);
    mqttConnectOptions.setCleanSession(true);
    mqttConnectOptions.setUserName(username);
    mqttConnectOptions.setPassword(password.toCharArray());
    mqttConnectOptions.setKeepAliveInterval(30);
    mqttConnectOptions.setConnectionTimeout(60);
    mqttConnectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
    try {
        mqttClient.connect(mqttConnectOptions);
    } catch (MqttSecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MqttException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

不要在主线程中发送它,而是使用另一个线程来发布消息。

Thread thread = new Thread() {
   public void run() {
       mqttClient.publish(topic, message);
   }  
};
thread.start(); 

关于有关一堆未完成的线程的评论,情况并非如此。在自己的线程中运行时,publish调用完成,线程刚刚创建的结束。

看来,在主线程中调用publish会导致线程锁定。对于这是图书馆中的错误还是设计的错误,需要进一步研究,但在其自身线程中调用publish可防止锁定锁。

问题实际上不是QoS值,而是您的客户端是否与MQTT服务器有良好/稳定的连接。如下所述publish

...是一种阻止方法,一旦发布完成

返回

发布可能未完成。检查您是否已连接到MQTT服务器,以及您的MQTT客户端是否已成功连接到MQTT服务器。

您也可以用try... catch ...语句包围呼叫,以查看是否有例外:

try {
  mqttClient.publish(topic, message);
} catch(Exception e) {
  e.printStackTrace();
}

这是图书馆中的错误(1.2.5之前的org.eclipse.paho.client.mqttv3(,使用QoS 0。

启动线程的解决方案是不正确的 - 虽然它看起来像是解决问题,但最终将获得许多无法完成的线程。最终,图书馆会抱怨"发表声明"太多了。而且您将无法发布消息。

问题同步mqttclient接收器线程僵局似乎是解决此问题时解决的问题。

一旦升级到1.2.5(也许是1.2.0后的较早版本(,使用QoS 0。

相关内容

最新更新