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

Java 从MQTT获取已在使用的持久性错误,java,mqtt,Java,Mqtt,当我尝试创建新的mqtt客户机时,我从mqtt代理获得以下异常。错误就在这里--- 这里是MQTTHandler类createClient()方法--- 当我第一次为用户ID创建客户端时,它就可以工作了。从第二次开始,它就失败了,出现了上述异常。我在这里使用的是clean session=false 如果有人有任何想法,请告诉我。谢谢。看起来两个客户端都试图使用同一个文件进行持久化。 Javadocs for says 初始化持久存储。如果存在此客户端ID的持久存储,则打开它,否则创建一个新的持

当我尝试创建新的mqtt客户机时,我从mqtt代理获得以下异常。错误就在这里---

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

当我第一次为用户ID创建客户端时,它就可以工作了。从第二次开始,它就失败了,出现了上述异常。我在这里使用的是
clean session=false


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

看起来两个客户端都试图使用同一个文件进行持久化。
Javadocs for says

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


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

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

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

如果我使用MemoryPersistence而不是默认的FilePersistence,那么问题确实会得到解决@亚历山德罗,谢谢你的邮件。就我的情况而言,我不希望保留单独的客户ID-s;这是一种要求。因此,我现在使用MemoryPersistence,它工作得很好;至少现在:)您唯一要更改的是客户机id,如果未指定,则该id将用于生成持久性目录
client = new MqttClient("tcp://192.168.1.100:1883", "One");
client1 = new MqttClient("tcp://192.168.1.100:1883", "One");
client = new MqttClient("tcp://192.168.1.100:1883", "Two");