【问题标题】:Temporary Muc rooms not getting deleted even after everyone leaves the room即使每个人都离开房间,临时 Muc 房间也不会被删除
【发布时间】:2019-12-30 02:44:55
【问题描述】:

我正在使用 ejabberd-18.09。根据文档,我认为一旦房间的每个成员离开房间,临时房间就应该被删除。

但在我们的 ejabberd 仪表板上,我可以看到甚至一个月前创建的房间仍然存在于服务器上。

我可以在 ejabberd 仪表板上看到这个

JabberID ->   myroom@conference.example.com
participants -> 0
Last message -> A long time ago
Public -> true  
Persistent -> false
Logging -> false
Justcreated -> true

并且有数百个房间有类似的信息。

我的房间配置是这样的

    host: "conference.@HOST@"
    access:
      - allow
    access_admin:
      - allow: admin
    access_create: all
    access_persistent: muc_create
    default_room_options:
      allow_change_subj: false
      allow_query_users: true
      allow_private_messages: true
      members_by_default: true
      anonymous: true
    max_users: 10

我有点迷路了。为什么会这样?

谁能帮帮我吗?

编辑

我正在使用 mod_muc:create_room/5 创建房间。然后我从 ejabberd 直接向其他用户发送邀请,其他用户接受邀请,然后加入聊天室。

为了销毁房间,客户端发送destroy包来销毁聊天在常规场景中,但是如果我们的客户端在房间创建一段时间后未能发送销毁包(由于应用程序在后台等不同原因,a电话等)他们只是离开房间,在这种情况下,我希望临时房间能发挥作用,在每个人离开后它们被摧毁。

是 ejabberd.log 文件中的日志

<0.23497.0>@mod_muc_room:init:137 Created MUC room myroom@conference.example.com by user1@example.com/xiaomi

<0.23476.0>@ejabberd_c2s:process_terminated:262 (tcp|<0.23476.0>) Closing c2s session for user1@example.com/xiaomi: Stream reset by peer
2019-08-26 17:15:13.201 [info] <0.23497.0>@mod_muc_room:close_room_if_temporary_and_empty:1120 Destroyed MUC room myroom@conference.example.com because it's temporary and empty
2019-08-26 17:15:13.201 [info] <0.23497.0>@mod_muc_room:terminate:703 Stopping MUC room myroom@conference.example.com

在 ejabberd 仪表板中有一些带有值的房间

JabberID ->   myroom1@conference.example.com
participants -> 0
Last message -> A long time ago
Public -> true  
Persistent -> false
Logging -> false
Justcreated -> true

虽然有一些像

JabberID ->   myroom2@conference.example.com
participants -> 1
Last message -> A long time ago
Public -> true  
Persistent -> false
Logging -> false
Justcreated -> false

大多数情况下,有 0 人的房间有Justcreated as true,而有 1 人的房间有Justcreated as false

【问题讨论】:

    标签: ejabberd ejabberd-module


    【解决方案1】:

    根据文档,我认为临时房间应该 一旦房间的每个成员离开房间,就会被删除。

    对。在 ejabberd 日志文件中,当用户加入新房间时:

    18:04:06.637 [info] Created MUC room myroom@conference.localhost by user3@localhost/tka1
    User leaves the room:
    18:04:11.143 [info] Destroyed MUC room myroom@conference.localhost because it's temporary and empty
    18:04:11.144 [info] Stopping MUC room myroom@conference.localhost
    

    创建房间然后用户离开时,您在 ejabberd.log 中看到了什么?

    但在我们的 ejabberd 仪表板上,我可以看到房间甚至创建了一个 一个月前仍然存在于服务器上。

    房间是如何创建的?

    如果您使用桌面 Jabber 客户端(例如 Gajim、Psi 或其他)创建房间,该房间是否在用户离开后也保持活跃?

    刚刚创建 -> 真实

    嗯,这很奇怪。当房间刚刚创建时,Just created 设置为 true。立即执行加入第一个用户的代码,并且该代码将 Justcreated 设置为该用户的时间戳。

    您所有的空房间和临时房间都已 Justcreated 为真?

    【讨论】:

    • 我已经用您的问题信息编辑了我的问题
    【解决方案2】:

    我正在使用 mod_muc:create_room/5 创建房间。然后我发送 从 ejabberd 向其他用户直接邀请其他用户

    更好地使用为管理员提供的 API:

    $ ejabberdctl create_room room2 conference.localhost localhost
    $ ejabberdctl send_direct_invitation room2 conference.localhost "" "Join this cool room" user4@localhost
    

    顺便说一句;我在 ejabberd 中发现了一个问题,尝试应用这个补丁,所以命令 create_room 不会创建强制持久化房间:

    diff --git a/src/mod_muc_admin.erl b/src/mod_muc_admin.erl
    index 805e72481..9aed4a017 100644
    --- a/src/mod_muc_admin.erl
    +++ b/src/mod_muc_admin.erl
    @@ -623,10 +623,7 @@ justcreated_to_binary(J) when is_atom(J) ->
     %%       ok | error
     %% @doc Create a room immediately with the default options.
     create_room(Name1, Host1, ServerHost) ->
    -    case create_room_with_opts(Name1, Host1, ServerHost, []) of
    -        ok -> change_room_option(Name1, Host1, <<"persistent">>, <<"true">>);
    -        Error -> Error
    -    end.
    +    create_room_with_opts(Name1, Host1, ServerHost, []).
    
     create_room_with_opts(Name1, Host1, ServerHost, CustomRoomOpts) ->
         true = (error /= (Name = jid:nodeprep(Name1))),
    

    【讨论】:

    • 嗨@Badlop,我正在使用 mod_muc:create_room/5 因为我需要以编程方式创建房间。据我了解,ejabberdctl 仅供管理员使用,是否也可以以编程方式使用它来创建房间?
    • 同时,我想我已经找到了为什么我的大部分临时房间都没有被删除。这就是正在发生的事情。一个房间被创建并且用户加入这个房间。现在如果房间里只剩下一个用户并且他下线了,那么房间不会立即被删除,但是一段时间后,当最后一个下线的用户再次上线时,房间会先被删除,然后正在再次创建。对于大多数房间,这个过程会发生 3-4 次,最后大部分这样的房间都没有被删除。正常吗?如果没有,我该如何解决?
    • 当然命令可以通过程序运行,你可以在shell中使用ejabberdctl,或者ReST调用,或者XMLRPC调用来执行它们(安装并启用相应的模块)。
    • 好的,让我试试看,与此同时,您能否解释一下为什么当用户重新连接时会重新创建房间(正如我在第二条评论中所写的那样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2018-10-05
    相关资源
    最近更新 更多