java - 在 MQTT java 中使用 qos = 0 发布消息时程序挂起

标签 java mqtt

我正在 thingstream 中处理 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");

使用的库 - o​​rg.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 可以防止等待锁定。

关于java - 在 MQTT java 中使用 qos = 0 发布消息时程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49608077/

相关文章:

Java:无法让 .equals() 工作

java - 使用 Spring Boot 在 Jpa 中查询时出错

java - Paho Mqtt Android 连接到代理失败 (32103)

mqtt - 将编辑的conf文件传递给docker容器中的mosquitto时出错

java - 需要帮助在使用基本适配器的 ListView 上设置点击事件

java - JTextArea 在 SwingWorker 中打印时不会自动滚动

python - 使用 MQTT 发送的图像的最大尺寸是多少

tcp - MQTT:不可靠的交付而不是 TCP

android - AWS IOT 在 Android 中即时注册证书

java - 在Java中引用dll