2016-11-28 1 views
11

J'ai construit une application de discussion en utilisant un serveur Openfire (xmpp). Les discussions de personne à personne fonctionnent bien et les messages sont livrés instantanément. Mais lorsque nous envoyons un message à l'intérieur d'un groupe, le premier message est retardé et le deuxième message est transmis instantanément.Messagerie de groupe retardée dans openfire

MultiUserChatManager groupChat = 
      MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name"); 
groupChat.send("Message object"); 

Pourquoi le premier message est-il retardé?

Création est CUM

MultiUserChatManager mchatManager = MultiUserChatManager.getInstanceFor(xmpptcpConnection); 
     MultiUserChat mchat = mchatManager.getMultiUserChat(group); 
     if (!mchat.isJoined()) { 
     Log.d("CONNECT", "Joining room !! " + group + " and username " + username); 
     boolean createNow = false; 
     try { 
      mchat.createOrJoin(username); 
      createNow = true; 
     } catch (Exception e) { 
      Log.d("CONNECT", "Error while creating the room " + group + e.getMessage()); 
     } 

     if (createNow) { 

      Form form = mchat.getConfigurationForm(); 
      Form submitForm = form.createAnswerForm(); 

      List<FormField> formFieldList = submitForm.getFields(); 
      for (FormField formField : formFieldList) { 
      if(!FormField.Type.hidden.equals(formField.getType()) && formField.getVariable() != null) { 
       submitForm.setDefaultAnswer(formField.getVariable()); 
      } 
      } 

      submitForm.setAnswer("muc#roomconfig_persistentroom", true); 
      submitForm.setAnswer("muc#roomconfig_publicroom", true); 

      mchat.sendConfigurationForm(submitForm); 

      //mchat.sendConfigurationForm(
      // new Form(DataForm.Type.submit)); //this is to create the room immediately after join. 
     } 
     } 
     Log.d("CONNECT", "Room created!!"); 
     return true; 
    } catch (SmackException e) { 
     e.printStackTrace(); 
    } catch (XMPPException.XMPPErrorException e) { 
     e.printStackTrace(); 
    } 
+0

Peut-être que vous stockez le message entrant dans une base de données? Si oui, je suppose que c'est plus un problème en créant la base de données qu'un message retardé ... – Opiatefuchs

+0

Il se produit seulement le premier message seulement. Une fois que nous passons au groupe, la même chose arrive dans le premier message. –

+0

Si c'est seulement une question de base de données, alors les mêmes choses se reproduisent encore et encore –

Répondre

3

Il y a une question au sujet de la création et une sorte de effet secondaire propagé sur l'envoi.

Je pense simplement que vous devez joindre le chat la première fois depuis que vous ne l'avez pas déjà fait et que le premier message active également le Groupchat sur le serveur, donc le premier message est retardé car vous n'avez pas finalisé la création multiuserchat.

Comment réparer.

En phase de création, cette partie doit être améliorée:

if (!mchat.isJoined()) { 
     Log.d("CONNECT", "Joining room !! " + group + " and username " + username); 
     boolean createNow = false; 
     try { 
      mchat.createOrJoin(username); 
      createNow = true; 
     } catch (Exception e) { 
      Log.d("CONNECT", "Error while creating the room " + group + e.getMessage()); 
     } 

Avec seulement:

boolean createNow 
try 
{ 
    if (!mchat.isJoined()) 
    { 
     createNow = mchat.createOrJoin(username); 
    } 
} 
catch (Exception e) 
{ 
    throw new Exception("ERROR!"); 
} 

et après invokation:

mchat.sendConfigurationForm(submitForm); 

ajouter:

if (!mchat.isJoined()) { 
    mchat.join(username); 
} 

creationOrJoin méthode c'est à propos de la création OU join (comme son nom l'indique): pour activer le chat, vous devez le rejoindre après la phase de création.

Cependant createOrJoin a peut-être un comportement inattendu en raison d'une double vérification au sujet des chambres déjà jointes à garder syncro entre session client et une session sur le serveur, de sorte que le mchat.join()doit être invoquée après. Un nom explicite peut ressembler à: mustCreateBeforeOrCanJoinDirectly()

+0

Désolé ami mais son ne fonctionne pas .. –

+0

il peut retarder le côté du serveur ???? –

+0

redémarrez Openfire si vous le pouvez et essayez avec une toute nouvelle conversation. Si ne fonctionne pas à nouveau, nous pouvons vérifier quelque chose de différent (mais je suggère d'utiliser mon extrait). Je n'ai aucun problème à propos du premier message du tout ... – MrPk