【问题标题】:Getting Persistence Already in Use error from MQTT从 MQTT 获取 Persistence Already In Use 错误
【发布时间】:2014-02-07 09:29:35
【问题描述】:

当我尝试创建新的 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 

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

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

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

MqttClient subClient = null;

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

} catch (MqttException e) {

}

当我第一次为 userId 创建客户端时,它会起作用。从第二次开始,它会因上述异常而失败。我在这里使用clean-session=false。

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

【问题讨论】:

    标签: java mqtt


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我使用 MemoryPersistence 而不是默认的 FilePersistence,问题确实会得到解决。 @Alessandro,谢谢你的帖子。对于我的情况,我不希望维护单独的 clientID-s;这是排序的要求。因此,我现在使用 MemoryPersistence 工作正常;至少现在:)
    【解决方案2】:

    这是因为在两个客户端中您都使用相同的持久性名称。

    client = new MqttClient("tcp://192.168.1.100:1883", "One");
    

    在下一个线程中你使用的是相同的:

    client1 = new MqttClient("tcp://192.168.1.100:1883", "One");
    

    对于您要建立的每个连接,持久性名称应该不同。您必须在 client1 中进行这样的更改:

    client = new MqttClient("tcp://192.168.1.100:1883", "Two");
    

    【讨论】:

    • 您唯一要更改的是客户端 ID,如果未指定,则用于生成持久目录
    猜你喜欢
    • 2022-12-26
    • 2022-10-23
    • 2022-12-01
    • 1970-01-01
    • 2011-05-11
    • 2021-06-04
    • 2013-08-03
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多