从MQTT获取持久性已使用错误

cha*_*rar 8 java mqtt

当我尝试创建一个新的MqttClient时,我从mqtt代理获得以下异常.错误在这里---

Caused by: Persistence already in use (32200)
at org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence.open(MqttDefaultFilePersistence.java:108) [mqtt-client-0.4.0.jar:]
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:273) [mqtt-client-0.4.0.jar:]
at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:222) [mqtt-client-0.4.0.jar:]
at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:134) [mqtt-client-0.4.0.jar:]
at com.ericsson.asdp.virtualassist.notification.messaging.MQTTHandler.createClient(MQTTHandler.java:61) [classes:]
at com.ericsson.asdp.virtualassist.notification.messaging.MQTTMessagingService.receieve(MQTTMessagingService.java:52) [classes:]
... 44 more 
Run Code Online (Sandbox Code Playgroud)

这是receive()我尝试连接到mqtt的java类方法的代码---

MqttClient subClient = null;
try {
    subClient = mqttHandler.createClient(userId, brokerURL);
    MQTTNotificationSubscriber notificationSub = new MQTTNotificationSubscriber(mqttHandler);
    notificationSub.setUserId(userId);

    subClient.setCallback(notificationSub);
    mqttHandler.subscribe(subClient, userId);
    // do something here
} catch (Exception e) {
    logger.error("Error in receive " + e.getMessage());
        throw new VirtualAssistServicesException(e.getMessage(), e);
}  finally {
    try {
        mqttHandler.disconnect(subClient);
    } catch (MqttException e) {
        throw new VirtualAssistServicesException(e.getMessage(), e);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是MQTTHandler类createClient()方法---

MqttClient subClient = null;

try {
    subClient = new MqttClient(brokerURL, clientId);

} catch (MqttException e) {

}
Run Code Online (Sandbox Code Playgroud)

当我第一次为userId创建客户端时,它可以工作.从第二次起,它失败并出现上述异常.我在clean-session=false这里用.

如果有人有任何想法,请告诉我.谢谢.

Ale*_*gna 9

看起来两个客户端都试图使用相同的文件进行持久化.MqttDefaultFilePersistence.open()的
Javadocs 说

初始化持久性存储.如果此客户端ID存在持久存储,则打开它,否则创建一个新存储.如果持久性存储已经打开,那么只需返回.应用程序可以使用相同的客户端ID连接到许多不同的服务器,因此客户端ID与连接一起将唯一地标识所需的持久性存储.
抛出: MqttPersistenceException - 如果打开持久存储时出现问题.

我认为该文件已经打开,您必须clientId在代码中为每个Mqtt客户端使用不同的文件.