2015-11-30 2 views
3

Я получаю исключение «java.io.eof», когда я пытаюсь подписаться на клиент mqtt. Я использую eclipse paho library и используя mosquitto broker. Я не получаю ответа на этот вопрос, поэтому, пожалуйста, помогите мне, почему это происходит?Eclipse paho Mqtt: Получение java.io.EOF Исключение

MQTT соединение и подписаться

Я использую этот код для подключения и подписки на mosquitto

private void buildClient(String clientId){ 
    log.debug("Connecting... "+clientId); 
     try { 
      mqttClient = new MqttClient(envConfiguration.getBrokerUrl(), clientId,new MemoryPersistence()); 
      System.out.println(mqttClient.isConnected()); 
     } catch (MqttException e) { 
      log.debug("build client stopped due to "+e.getCause()); 
     } 

     chatCallback = new ChatCallback(this.userService,this); 
     mqttClient.setCallback(chatCallback); 
     mqttConnectOptions = new MqttConnectOptions(); 
     mqttConnectOptions.setCleanSession(true); 
    } 

    @Override 
    public void connect(String clientId,String topic) { 

     try{ 
      if(mqttClient == null || !mqttClient.getClientId().equals(clientId)){ 
       buildClient(clientId); 
       mqttClient.connect(mqttConnectOptions); 
       subscribe(clientId,topic); 
      } 
     }catch (Exception e) { 
      log.debug("connection attempt failed "+ e.getCause() + " trying..."); 
     } 
    } 

    @Override 
    public void subscribe(String clientId,String topic) throws MqttException { 
     if(mqttClient != null && mqttClient.isConnected()){ 

      mqttClient.subscribe(topic,0); 
      /*try { 
       log.debug("Subscribing... with client id :: " + clientId + "topic"); 
       mqttClient.subscribe(topic,2); 
      } catch (MqttException e) { 
       log.debug("subscribing error.."+e.getLocalizedMessage()); 
      }*/ 
     } 

    } 
} 

И MQTT перезвонит

@Override 
public void connectionLost(Throwable arg0) { 
    log.debug("Connection lost... attampting retrying due to " 
        + arg0); 
    arg0.printStackTrace(); 
    // chatServiceimpl.connect(); 

} 

@Override 
public void deliveryComplete(IMqttDeliveryToken arg0) { 
    log.debug("delivered message" + arg0); 
    // TODO Auto-generated method stub 

} 

@Override 
public void messageArrived(String arg0, MqttMessage arg1) throws Exception { 

    log.debug("Message recived..." + arg1.toString()); 
    userService.saveChat(arg1.toString()); 
} 

Я перед этой ошибки когда я подписываюсь на москит

Журналов ошибок

2015-11-30/18:19:00.877 [MQTT Call: 25287] DEBUG c.s.s.ChatCallback: Message recived...{ "id":"37153topic25287T1448886285.79573", "from":"37153", "to":"25287", "chatBody":[{"type": "text", "message":"The fact "}]} 
2015-11-30/18:19:00.878 [MQTT Call: 25287] DEBUG c.s.s.u.UserService: Saving chat... 
2015-11-30/18:19:00.883 [MQTT Call: 25287] DEBUG c.s.s.u.UserService: Get user by id::37153 
2015-11-30/18:19:00.885 [MQTT Call: 25287] DEBUG c.s.s.u.UserService: Get user by id::25287 
2015-11-30/18:19:00.886 [MQTT Rec: 25287] DEBUG c.s.s.ChatCallback: Connection lost... attampting retrying due to Connection lost (32109) - java.io.EOFException 
Connection lost (32109) - java.io.EOFException 
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:138) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.EOFException 
    at java.io.DataInputStream.readByte(DataInputStream.java:267) 
    at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:56) 
    at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:100) 
    ... 1 more 

Mosquitto Журналы

1448889230: Client 25287 disconnected. 
1448889230: New client connected from 192.168.2.63 as 25287 (c0, k60). 
1448889231: New connection from 192.168.2.242 on port 1883. 
1448889231: Client 25287 already connected, closing old connection. 
1448889231: Client 25287 disconnected. 
1448889231: New client connected from 192.168.2.242 as 25287 (c1, k60). 
1448889231: New connection from 192.168.2.63 on port 1883. 
1448889231: Client 25287 already connected, closing old connection. 
1448889231: Client 25287 disconnected. 
1448889231: New client connected from 192.168.2.63 as 25287 (c0, k60). 
1448889269: New connection from 192.168.2.242 on port 1883. 
+0

Было бы полезно увидеть что-нибудь от конца москита соединения. Можете ли вы обновить вопрос журналом из экземпляра сбоя? – hardillb

+0

Спасибо за быстрый ответ, у меня есть обновленный вопрос. –

+0

Но не с тем, что я просил, нам нужны журналы от брокера москитов, чтобы узнать, почему он, возможно, закрыл соединение. – hardillb

ответ

12

Вы несколько клиентов, подключающихся к брокеру с тем же идентификатором клиента, это не допускаетесь, и как один подключается брокер отключит подключенного в данный момент клиента.

Если у обоих клиентов есть логика автоматического повторного соединения, они просто продолжат удалять друг друга.

Изменение идентификатора клиента на одном из клиентов.

+0

Пожалуйста, еще один вопрос, как вы видели в моем коде mqtt клиент глобальный, так как я могу найти, что этот клиент уже подключен. И каков предел клиентского подключения на каждого брокера? –

+0

Вы не можете видеть, какие клиенты связаны с брокером, каждому клиенту нужен уникальный идентификатор. Предел для подключенных клиентов - ресурс, зависящий от хоста брокера. – hardillb

+0

Что это значит, я не понимаю. пожалуйста, не могли бы вы рассказать мне подробности? я беспокоюсь о таких вещах в производстве. –

0

Как указано выше, у вас есть несколько клиентов, подключающихся. Сервер (mosquitto) отключит старое соединение, когда он снова получит запрос на соединение от того же клиента.

использовать метод isConnected() на объекте MqttClient, чтобы узнать, подключено ли оно. например.

if (! m_client.isConnected()) { 
    // reconnect 
}