如何保持群聊房间(MUC)始终存在,即使与XMPP服务器断开连接?

10

我正在使用XMPP(Jabber)协议中的openfire/jsjac开发即时通讯模块(J2EE Web应用程序的一部分)。

openfire用户/组管理/表已经被重定向到我们的业务数据库表,这意味着我不再需要在openfire中维护用户/组。所有用户/组关系都在业务数据库中设置好了。

下面是我根据要求绘制的主窗格图像。由于我的声誉低,所以无法发布图片,因此我发布了一个包含即时消息主UI图像的网址。对于不便造成的不便,敬请谅解。 instantmessage main UI Image

你们可以看到在左边的窗格中,没有用户/组列表。有保存历史记录的会话,这让我感到困惑,特别是关于群组。

我阅读了来自XMPP.org的“XEP-0045: Multi-User Chat”。我了解了有关群聊的一般工作流程:

XEP-0045: Multi-User Chat"
  1. 创建房间,产生房间Jid。
  2. 配置房间。(保留房间)
  3. 从业务数据库中获取用户jid并将用户绑定(添加)到新创建的房间。
  4. 向房间发送消息。
  5. 服务将向所有组成员发送消息。

我知道有一种房间类型是持久房间,文档中解释为“如果最后一个占用者退出,则不会销毁的房间;反义词:临时房间。” 在同一文档中,有些句子说:

房间所有者必须能够销毁房间,特别是如果房间是持久的。工作流程如下:

  1. 房主请求销毁房间,可以选择指定原因和备用场所。
  • 该房间将所有用户从房间中删除(包括有关替代位置和被删除原因的适当信息),并销毁该房间,即使它被定义为持久性。
  • 阅读以上句子后,我更加困惑了,仍有几个问题让我不清楚。
    1. "占用者退出"的意思是什么?如果一个占用者从系统中注销(离线),这是否意味着"退出"。并且所有占用者都处于离线状态,这是否意味着"持久类型"将使我们创建的房间保持存在?那么房间信息保存在哪里?在openfire还是其他地方?
    2. 假设所有占用者存在(离线),尽管这个创建的房间没有被销毁,但绑定信息怎么样呢?我的意思是假设一个用户由管理员授予成员身份,如果这个用户存在或离线,持久房间将保留他的成员身份,对吗?换句话说,只要房间没有销毁,所有配置和绑定信息都不会丢失,对吗?
    3. 如果openfire服务器遇到重新启动的情况,创建的房间及其信息还会在那里吗?
    4. 如果管理员重新登录,如何重新找到创建的房间?通过保存房间ID吗?

    除了以上问题,我认为实现带有持久房间的MUC的工作流程。您能否检查一下并查看工作流程中存在的问题?

    我的带有持久房间的MUC工作流程

    1. 所有者向服务器发送出席对象以创建房间并提供房间JID,并设置房间ID。
    2. 所有者向服务器发送IQ对象以配置创建的房间并将房间类型设置为"persistent"。
    3. 所有者发送IQ对象以授予其他用户成员身份(绑定信息)。
    4. 所有者向ROOM jid发送消息对象,ROOM jid将转发所有消息给其绑定成员。
  • 本聊天室的普通成员负责处理消息(接收)并获取聊天室的 JID 和聊天室 ID(我希望所有用户,包括房主,都可以使用这个聊天室 ID 在重新登录时找到该聊天室)
  • 因此,无论是房主还是普通成员,如何根据聊天室 JID 或聊天室 ID 重新查找和重新加入已创建的“永久性”聊天室?

    3个回答

    2
    1. 规范中说“必须能够销毁”,而不是“必须销毁”。持久化的MUC在最后一个用户离开MUC时不会自动销毁。

    2. 这取决于MUC组件的实现。如果它将持久化MUC存储在持久化存储上,则能够在重新启动时重新加载所有持久化的MUC。我记得Openfire的MUC组件就是这样做的。

    3. 使其持久化。


    1. 如果房主重新登录,如何重新找到创建的房间?通过保存房间 ID 吗?
    - Ernesto

    0

    0

    您需要更新Openfire中的Java代码,以便在用户离线时不会删除群组。您需要针对Openfire中的MUC更新代码。


    请问您能帮我提供Openfire中MUC的代码吗?先谢谢了! - Suresh Jagnani

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接