Подтвердить что ты не робот

Отложенные групповые сообщения в openfire

Я создал приложение чата с использованием сервера Openfire (xmpp). Индивидуальные чаты работают нормально, и сообщения доставляются мгновенно. Но когда мы отправляем сообщение внутри группы, первое сообщение задерживается, а второе сообщение доставляется мгновенно.

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

Почему первое сообщение задерживается?

Создание MUC

 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();
    }
4b9b3361

Ответ 1

Существует проблема с созданием и видом побочного эффекта, распространяемого при отправке.

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

Как исправить.

На этапе создания эта часть должна быть улучшена:

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

С помощью только:

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

и после этого invokation:

mchat.sendConfigurationForm(submitForm);

добавить:

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

creationOrJoin метод создания ИЛИ join (как указано имя): чтобы активировать чат, вы должны присоединиться к нему после фазы создания.

Однако createOrJoin может возникнуть неожиданное поведение из-за двойной проверки уже соединенных комнат, чтобы синхронизация между сеансом в клиенте и сеансом на сервере, поэтому mchat.join() необходимо вызывать после. Явное имя может звучать так: mustCreateBeforeOrCanJoinDirectly()