Android openfire中的延迟组消息传递

Android openfire中的延迟组消息传递,android,openfire,smack,Android,Openfire,Smack,我使用Openfire(xmpp)服务器构建了一个聊天应用程序。一对一的聊天效果很好,信息可以即时传递。但是,当我们在组内发送消息时,第一条消息会延迟,第二条消息会立即发送 MultiUserChatManager groupChat = MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name"); groupChat.send("Message object"); 为什么第一

我使用Openfire(xmpp)服务器构建了一个聊天应用程序。一对一的聊天效果很好,信息可以即时传递。但是,当我们在组内发送消息时,第一条消息会延迟,第二条消息会立即发送

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
为什么第一条消息会被延迟

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
MUC创建是

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
 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();
    }
MultiUserChatManager mchatManager=MultiUserChatManager.getInstanceFor(xmpptcpConnection);
MultiUserChat mchat=mchatManager.getMultiUserChat(组);
如果(!mchat.isJoined()){
Log.d(“连接”、“加入房间!!”+group+“和用户名”+username);
布尔createNow=false;
试一试{
mchat.createOrJoin(用户名);
createNow=true;
}捕获(例外e){
Log.d(“连接”,“创建文件室时出错”+group+e.getMessage());
}
如果(现在创建){
Form Form=mchat.getConfigurationForm();
Form submitForm=Form.createAnswerForm();
List formFieldList=submitForm.getFields();
for(FormField FormField:formFieldList){
如果(!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(
//新表单(DataForm.Type.submit));//这是在加入后立即创建文件室。
}
}
Log.d(“连接”,“创建房间!!”;
返回true;
}捕捉(SmackException e){
e、 printStackTrace();
}捕获(XMPPException.XMPPErrorException){
e、 printStackTrace();
}

有一个关于创建和发送时传播的一种副作用的问题

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
我认为你需要第一次加入聊天室,因为你之前没有加入,而且第一条消息也激活了服务器上的Groupchat,所以第一条消息被延迟,因为你没有完成多用户聊天室的创建

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
如何修复

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
在创建阶段,必须改进此部分:

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
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());
        }
只要:

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
boolean createNow
try
{
   if (!mchat.isJoined())
   {
       createNow = mchat.createOrJoin(username);
   }
}
catch (Exception e)
{
  throw new Exception("ERROR!");
}
在调用之后:

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
mchat.sendConfigurationForm(submitForm);
加:

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
creationOrJoin方法关于创建或加入(如名称所示):要激活聊天,您必须在创建阶段后加入

MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");
但是,
createOrJoin
可能有意外行为,原因是仔细检查了已加入的房间,以保持客户端会话和服务器会话之间的同步,因此必须在
mchat.join()之后调用

显式名称听起来像:mustCreateBefore或CanjoinDirective()

是否将传入消息存储在数据库中?如果是的话,我想这更多的是因为创建数据库而不是延迟消息的问题……它只出现在第一条消息中。一旦我们切换组,同样的事情也会发生在第一条消息中。如果只是数据库问题,那么同样的事情会一次又一次地发生。是的,这就是我所想的。我猜如果发送第一条消息,您将创建一个新的数据库和/或表,这里可能会出现任何问题。但这只是一个假设,我从来没有遇到过MUC这样的问题。另一种情况是,用户登录(到组)需要很多时间。我已经检查了发送到服务器上的消息,但送达回执延迟。如果可以,请重新启动Openfire,并尝试使用全新的聊天工具。如果不再工作,我们可以检查一些不同的内容(不过我建议使用我的代码片段)。我对第一条信息没有任何疑问…看看这个答案:
MultiUserChatManager groupChat =
          MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name");
groupChat.send("Message object");