文章简述:服务器上配置并启动MQTT的服务器。MQTT客户端(微服务) 和 客户端(人脸识别机) 正常的建立了连接,微服务可以订阅到人脸识别机的消息。
如果有歧义或者更好的解决办法,希望可以评论交流交流!!!
正常连接,clientId 名为zsccds-client
问题:当发布线上环境,重启微服务后,微服务订阅消息, 然后人脸识别机下发订阅后,微服务不能订阅(接收)到消息。
我初步判断的原因是:
Durable Subs一直连上未清除,因为我设置了connOpts.setCleanSession(false);
CLIENT_ID是zsccds-client,然后导致原本创建的客户端zsccds-client一直和人脸识别机客户端进行连接,占用中。
// MQTT 连接选项
MqttConnectOptions connOpts = new MqttConnectOptions();
// 设置认证信息
connOpts.setUserName(MqttConfig.USERNAME);
connOpts.setPassword(MqttConfig.PASSWD.toCharArray());
connOpts.setCleanSession(false);
// 持久化
MemoryPersistence persistence = new MemoryPersistence();
// MQ客户端建立
client = new MqttClient(MqttConfig.IP_ADDRESS, MqttConfig.CLIENT_ID, persistence);
// 设置回调
client.setCallback(new MqttHandle());
// 建立连接
client.connect(connOpts);
微服务重启后连上mqtt后,发现Durable Subs里面有两种情况:
(1)多了一个新的连接,clientId是zsccds-client加一段数字,这里就不知道为什么会生成这个clientId,我设置的clientId是zsccds-client!!!
(2)或者是原来的zsccds-client,但是重启完的微服务实际却没有连上,zsccds-client应该是上一个占用的着的一条连接。
解决方法:
(1)我尝试将占用的zsccds-client进行删除。这里勾选,会出现一个Delete按钮。
producers是两部人脸识别机,consumers是微服务。
然后让微服务自动重连或者重启,之后微服务和人脸识别机又可以正常连接,正常下发和订阅。
弊端:使原来zsccds-client连接中的人脸识别机断掉,可能会使下发待消费的消息给清空掉。
(2)解决方法2,这个方法没有实验,猜想的缘由是断开Durable Subs中的consumers,在重启微服务之前,可以用请求接口进行 client.disconnect(),不重连,然后进行微服务重启, 重启完让微服务进行自动与mqtt连接。
Mqtt服务器下载&配置简述https://blog.csdn.net/qq_39625703/article/details/132865717