MQTT客户端连接服务端时的常见问题及解决

您所在的位置:网站首页 mrg软件 MQTT客户端连接服务端时的常见问题及解决

MQTT客户端连接服务端时的常见问题及解决

2023-07-23 12:30| 来源: 网络整理| 查看: 265

如何配置MQTT开源Java SDK的客户端自动连接开启SDK客户端自动重连功能mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setAutomaticReconnect(true);

将autoReconnect参数设置为true后,云消息队列 MQTT 版的Java SDK客户端会自动重连。

mqttClient.setCallback(new MqttCallbackExtended() { @Override public void connectComplete(boolean reconnect, String serverURI) { /** * 客户端连接成功后就需要尽快订阅的Topic。 */ System.out.println("connect success"); } @Override public void connectionLost(Throwable throwable) { throwable.printStackTrace(); } @Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { /** * 消费消息的回调接口,需要确保该接口不抛异常,该接口运行返回即代表消息消费成功。 * 消费消息需要保证在规定时间内完成,如果消费耗时超过服务端约定的超时时间,对于可靠传输的模式,服务端可能会重试推送,业务需要做好幂等去重处理。 * 超时时间请参见使用限制。 */ System.out.println( "receive msg from topic " + s + " , body is " + new String(mqttMessage.getPayload())); } @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { System.out.println("send msg succeed topic is : " + iMqttDeliveryToken.getTopics()[0]); } });

这样客户端的回调中的connectComplete方法被调用时就代表连接成功或重连成功,业务方无需关心连接情况。这时候重新建立的连接与之前的连接已经不是一个,因此之前客户端的内部连接上的消息发送订阅等行为会失效。

此时需要重新订阅Topic,这样业务侧在新的内部连接中可以继续发送订阅消息。

@Override public void connectComplete(boolean reconnect, String serverURI) { /** * 客户端连接成功后就需要尽快订阅需要的Topic。 */ System.out.println("connect success"); executorService.submit(new Runnable() { @Override public void run() { try { final String topicFilter[] = {mq4IotTopic}; final int[] qos = {qosLevel}; mqttClient.subscribe(topicFilter, qos); } catch (MqttException e) { e.printStackTrace(); } } }); }业务侧手动维护客户端连接mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setAutomaticReconnect(false);

当autoReconnect参数设置为false时,云消息队列 MQTT 版的客户端断开后不会自动重连。

当连接断开后,业务侧会抓取到异常,需要手动将旧的连接关闭,然后重新建立新的连接。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3