openfire 中的延迟群发消息
Posted
技术标签:
【中文标题】openfire 中的延迟群发消息【英文标题】:Delayed group messaging in openfire 【发布时间】:2017-04-12 04:03:22 【问题描述】:我使用 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();
【问题讨论】:
也许您将传入的消息存储在数据库中?如果是,我想创建数据库比延迟消息更成问题... 它只出现在第一条消息 Only 。一旦我们切换组,第一条消息也会发生同样的情况。 如果只是数据库问题,那么同样的事情会一次又一次地发生 是的,这就是我的想法。我猜如果发送了第一条消息,您会创建一个新的数据库和/或表,这可能是任何问题。但这只是一个假设,我在 MUC 上从未遇到过这样的问题。另一种情况是用户登录(到组)需要很多时间。 我已经检查了发送到服务器上的消息,但送达回执延迟 【参考方案1】:有一个关于创建的问题和一种在发送时传播的副作用。
我认为只是你需要第一次加入聊天,因为你以前没有,第一条消息也激活了服务器上的群聊,所以第一条消息被延迟了,因为你没有完成多用户聊天的创建。
如何解决。
在创作阶段,这部分必须改进:
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!");
在此调用之后:
mchat.sendConfigurationForm(submitForm);
添加:
if (!mchat.isJoined())
mchat.join(username);
creationOrJoin 方法是关于创建OR加入(顾名思义):要激活聊天,您必须在创建阶段后加入。
但是,createOrJoin
可能会出现意外行为,因为要仔细检查已加入的房间以保持客户端会话和服务器会话之间的同步,因此 mchat.join()
必须在之后调用。
明确的名称听起来像:mustCreateBeforeOrCanJoinDirectly()
【讨论】:
如果可以的话,重新启动 Openfire 并尝试全新的聊天。如果不能再次工作,我们可以检查一些不同的东西(但我建议使用我的 sn-p)。我对第一条消息完全没有意见...... 看看这个答案:***.com/questions/37875539/…以上是关于openfire 中的延迟群发消息的主要内容,如果未能解决你的问题,请参考以下文章