Отложенные групповые сообщения в 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();
}
Ответы
Ответ 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()