MQTT里避免重复订阅时用到的字段sessionPresent,为什么我测试的 sessionPresent 全是 false,(cleanSession=false)
MqttClient client = new MqttClient("tcp://localhost:1883", "push");
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName("aaaaaa");
options.setPassword("aaaaa".toCharArray());
options.setCleanSession(false);
IMqttToken iMqttToken = client.connectWithResult(options);
iMqttToken.waitForCompletion();
boolean sessionPresent = iMqttToken.getSessionPresent();
System.out.println("firstResult: " + sessionPresent); // 第一次访问返回false 正常
MqttMessage message = new MqttMessage();
client.publish("tt", "zxzx".getBytes(), 1, false);
client.disconnect();
IMqttToken secondToken = client.connectWithResult(options);
secondToken.waitForCompletion();
boolean secondResult = secondToken.getSessionPresent();
System.out.println("secondResult: " + secondResult); // 第二次不是应该返回 true 了吗?为什么还是false
在MQTT协议中,sessionPresent字段指示的是客户端与服务器之间是否存在会话。当cleanSession设置为false时,表示不删除现有的会话状态,因此在客户端断开连接后再次连接时,会话仍然存在。
然而,sessionPresent字段并不总是能够反映出会话的真实状态。具体取决于MQTT服务器的实现方式,有些服务器可能在客户端断开连接后立即删除会话,即使cleanSession设置为false。
在你的代码中,第一次连接后打印的sessionPresent为false可能是由于服务器在客户端断开连接后立即删除了会话。因此,即使你在第二次连接时使用了相同的的选择器,服务器可能并没有保留会话状态,导致sessionPresent仍然为false。
为了确保在第二次连接时能够正确地获取会话状态,你可以尝试在第一次连接后等待一段时间,然后再断开连接,以确保服务器的会话状态不会立即被删除。另外,你还可以检查服务器的日志或文档,以了解其会话管理的具体实现方式,以便更好地控制会话的状态。