2015-11-27 2 views
0

Мы решили использовать протокол mqtt для модуля чата в нашем мобильном приложении. Я хочу также сохранить сообщения темы на стороне сервера. Но я видел, что mqtt client здесь глобальный, поэтому один из способов - подписаться на один экземпляр клиента mqtt на все темы и сохранить сообщения в базе данных. но это правильный подход для этого. Я просто беспокоюсь об этом.Mqtt: сообщение Persist на стороне сервера

private void buildClient(){ 
     log.debug("Connecting... "+CLIENT_ID); 
     try { 
      mqttClient = new MqttClient(envConfiguration.getBrokerUrl(), CLIENT_ID); 
     } catch (MqttException e) { 
      log.debug("build client stopped due to "+e.getCause()); 
     } 
     chatCallback = new ChatCallback(); 
     mqttClient.setCallback(chatCallback); 
     mqttConnectOptions = new MqttConnectOptions(); 
     mqttConnectOptions.setCleanSession(false); 
    } 

    @Override 
    public void connect() { 
     if(mqttClient == null || !mqttClient.getClientId().equals(CLIENT_ID)){ 
      buildClient(); 
     } 
     boolean tryConnecting = true; 
     while(tryConnecting){ 
      try { 
       mqttClient.connect(mqttConnectOptions); 
      } catch (Exception e) { 
       log.debug("connection attempt failed "+ e.getCause() + " trying..."); 
      } 
      if(mqttClient.isConnected()){ 
       tryConnecting = false; 
      }else{ 
       pause(); 
      } 
     } 
    } 


    @Override 
    public void publish() { 
     boolean publishCallCompletedErrorFree = false; 
     while (!publishCallCompletedErrorFree) { 
      try { 
       mqttClient.publish(TOPIC, "hello".getBytes(), 1, true); 
       publishCallCompletedErrorFree = true; 
      } catch (Exception e) { 
       log.debug("error occured while publishing "+e.getCause()); 
      }finally{ 
       pause(); 
      } 
     } 
    } 

    @Override 
    public void subscribe() { 
     if(mqttClient != null && mqttClient.isConnected()){ 
      try { 
       mqttClient.subscribe(TOPIC, 2); 
      } catch (MqttException e) { 
       log.debug("subscribing error.."+e.getCause()); 
      } 
     } 

    } 

    @Override 
    public void disconnect() { 
     System.out.println(this.mqttClient.isConnected()); 
     try { 
      mqttClient.disconnect(); 
      log.debug("disconnected.."); 
     } catch (MqttException e) { 
      log.debug("erro occured while disconneting.."+e.getCause()); 
     } 
    } 

ответ

0

Есть два варианта, как решить эту проблему:

  • Написать клиент MQTT, который присоединяется ко всем тем, используя подстановочные знаки (# в MQTT)
  • Написать брокер плагин, который делает то работа для вас, в зависимости от реализации брокера вы используете

Существует хорошее описание того, как реализовать оба варианта на HiveMQ website, также desc ограничивающие границы первого варианта.

Смежные вопросы