使用Eclipse Paho的Mqtt客户端

时间:2018-05-08 13:49:18

标签: java mqtt paho

我正在使用Eclipse Paho实现MQTT客户端并遇到一些问题:

发布者和订阅者都使用qos = 1和setCleanSession =连接到代理 假的。

我的流程:

  1. 将订阅者和发布者连接到经纪人,没关系。
  2. 断开订阅者(我强制停止包含订阅者的我的项目),发布者继续发布消息。
  3. 重新连接订阅者 - >它无法连接并抛出异常:connectionLost。
  4. 如果我设置了Subscriber = 0的qos,它不会抛出异常,但是当订阅者离线时,客户端不会收到发布者发送的消息,这是我不想要的

    有人可以帮我这个吗?

    这是我在subcriber中的代码

    try {
                // Create an Mqtt client
                MqttAsyncClient mqttClient
                        = new MqttAsyncClient("tcp://" + swmConfig.getMqttApiLink(), "MeasureTransactionApi");
                // new MqttAsyncClient(serverURI, clientId, persistence)
                MqttConnectOptions connOpts = new MqttConnectOptions();
                connOpts.setUserName(swmConfig.getMqttUsername());
                connOpts.setPassword(swmConfig.getMqttPassword().toCharArray());
                connOpts.setCleanSession(false);
    
                // Connect to RabbitMQ Broker
                log.info("Connecting to RabbitMQ broker: " + swmConfig.getMqttApiLink());
                IMqttToken conToken = mqttClient.connect(connOpts);
                conToken.waitForCompletion(10000);
                if (!conToken.isComplete() || conToken.getException() != null) {
                    log.info("Error connecting: " + conToken.getException());
                    System.exit(-1);
                }
                log.info("Connected");
    
                // Latch used for synchronizing b/w threads
                final CountDownLatch latch = new CountDownLatch(1);
    
                // Callback - Anonymous inner-class for receiving messages
                mqttClient.setCallback(new MqttCallback() {
    
                    public void messageArrived(String topic, MqttMessage message) {
                        String time = new Timestamp(System.currentTimeMillis()).toString();
                        log.info("\nReceived a Message from RabbitMQ Broker" + "\n\tTime:    " + time
                                + "\n\tTopic:   " + topic + "\n\tMessage: "
                                + new String(message.getPayload()) + "\n\tQoS:     "
                                + message.getQos() + "\n");
    
                        handleMQTTMessageService.handleMessageArrived(message);
                    }
    
                    public void connectionLost(Throwable cause) {
                        log.info("Connection to RabbitMQ broker lost!" + cause.getMessage());
                        latch.countDown();
                    }
    
                    public void deliveryComplete(IMqttDeliveryToken token) {
                        log.info("deliveryComplete");
                    }
    
                });
    
                // Subscribe client to the topic filter with QoS level of 1
                log.info("Subscribing client to topic: " + topic);
                IMqttToken subToken = mqttClient.subscribe(topic, 1);
                subToken.waitForCompletion(10000);
                if (!subToken.isComplete() || subToken.getException() != null) {
                    log.info("Error subscribing: " + subToken.getException());
                    System.exit(-1);
                }
            } catch (MqttException me) {
                log.error("Error:", me);
            }
    

1 个答案:

答案 0 :(得分:0)

QOS对发布商和订阅者而言是独立的。

为确保交付给订阅客户,您需要以高于QOS 0的价格订阅。

QOS 0订阅会发生什么情况取决于代理,默认情况下大部分都不会为QOS 0订阅排队消息,但mosquitto可以强制使用queue_qos0_messages配置标志