繁体   English   中英

带有Eclipse Paho的Mqtt客户端

[英]Mqtt Client with Eclipse Paho

我正在用Eclipse Paho实现MQTT Client,并且有一些问题:

发布者和订阅者都通过qos = 1和setCleanSession = false连接到代理。

我的流程:

  1. 将订阅服务器和发布服务器连接到代理,可以。
  2. 断开订阅服务器(我强制停止包括订阅服务器的我的项目),发布服务器继续发布消息。
  3. 重新连接订户->它无法连接并引发异常:connectionLost。

如果我将订户的qos设置为0,则不会引发异常,但是当订户处于脱机状态时,客户端不会收到发布者发送的消息,我不希望这样做

有人可以帮我弄这个吗?


这是我的用户代码

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);
        }

QOS对于发布者和订阅者都是独立的。

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

QOS 0订阅会发生什么情况取决于代理,默认情况下,大多数不会使QOS 0订阅的消息排队,但是可以使用queue_qos0_messages配置标志将queue_qos0_messages强制设置为queue_qos0_messages

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM