2014-02-07 28 views
7

當我嘗試創建新的MqttClient時,我從mqtt代理獲取以下異常。該錯誤是在這裏---獲取持久性已使用來自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 ---

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

我的java類方法的代碼這裏是MQTTHandler createClient()類方法---

MqttClient subClient = null; 

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

} catch (MqttException e) { 

} 

當我第一次爲userId創建客戶端時,它工作。從第二次起,它不符合上述例外。我在這裏使用clean-session=false

如果有人有任何想法,請讓我知道。謝謝。

回答

8

看起來像兩個客戶端都試圖使用相同的文件進行持久性。
Javadoc文檔MqttDefaultFilePersistence.open()

初始化持久性存儲。如果此客戶端ID存在持久性存儲,請將其打開,否則請創建一個新的。如果持久存儲已經打開,那麼就返回。應用程序可以使用相同的客戶端ID連接到許多不同的服務器,因此客戶端ID與連接一起將唯一標識所需的持久存儲區。
拋出: MqttPersistenceException - 如果在打開 持久存儲時發生問題。

我想這個文件已經打開了,您必須在您的代碼中爲您的每個Mqtt客戶端使用不同的clientId

+1

如果使用MemoryPersistence而不是默認的FilePersistence,問題會得到解決。 @Alessandro,thx爲你的職位。對於我的情況,我不希望維護單獨的clientID-s;這是一種需求。因此,我現在使用MemoryPersistence,它工作正常;至少現在:) – chakrar

1

這是因爲在兩個客戶端中使用相同的持久性名稱。

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

在一個線程使用的是相同的:

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

持久性的名稱應該是你想使每個連接不同。您必須在客戶端1中進行如下更改:

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

你正在改變的唯一東西是客戶端ID,然後用它來生成一個持久化目錄(如果沒有指定的話) – Clocker