XMPP:脱机消息不是由 Conversations 接收的,而是由来自 ejabberd 的 Gajim 接收的
XMPP: Offline messages are not received by Conversations, but by Gajim from ejabberd
基本场景
Bob 离线,Alice 作为客户端使用 Conversations 1.23.8 向他发送消息。服务器是 运行 debian 上的 ejabberd 18.01。
当
时,Bob 被视为离线
ejabberdctl connected_users
没有列出他的名字。
然后消息被ejabberd存储在离线消息存储中。这是由以下人员检查的:
ejabberdctl get_offline_count bob example.com
在/etc/ejabberd/ejabberd.yml
中配置mod_offline:
access:
max_user_offline_messages:
admin: 5000
all: 100
...
modules:
mod_offline:
access_max_user_messages: max_user_offline_messages
...
案例A:
Bob 使用 gajim 1.0.0 连接到服务器。他收到离线消息和
ejabberdctl get_offline_count bob example.com
returns 0(在他连接之前是 >0)并且日志 (/var/log/ejabberd/ejabberd.log
) 说:
2018-03-24 17:32:10.132 [debug] <0.4422.0>@xmpp_socket:send:218 (tls|<0.4422.0>) Send XML on stream = <<"<message xml:lang='en' to='bob@example.com/gajim.8FNGJDH5' from='alice@example.com/phone' type='chat' id='643ah4c3-8920-4c52-82b1-89s6f759vff7'><request xmlns='urn:xmpp:receipts'/><markable xmlns='urn:xmpp:chat-markers:0'/><origin-id xmlns='urn:xmpp:sid:0' id='643ah4c3-8920-4c52-82b1-89s6f759vff7'/><active xmlns='http://jabber.org/protocol/chatstates'/><delay from='example.com' stamp='2018-03-24T16:31:54.745016Z' xmlns='urn:xmpp:delay'>Offline storage</delay><body>This is my message.</body></message>">>
到目前为止,还不错。
案例 B:
Bob 使用 Conversations 1.23.8 连接到服务器。他没有收到离线消息,但是
ejabberdctl get_offline_count bob example.com
returns 0 无论如何(在他连接之前它是 >0)并且日志 (/var/log/ejabberd/ejabberd.log
) 没有像案例 A 中那样的条目。
问题:
我已经为此工作了几天。我查看了服务器的配置以及客户端的配置。根据我的经验,我会说这是 Conversations 客户端的问题,但我现在不知道去哪里找。我应该在 ejabberd.log 中查找什么日志消息?
Conversations 1.23.8 似乎不支持离线消息 (XEP-0160),但它支持消息存档管理 (MAM - XEP-0313)。
我现在的解决方案是将离线消息重定向到 MAM,客户端在连接到服务器时与他们的妈妈同步。提示:默认情况下,MAM 在 ejabberd 18.01 中是禁用的。
我的 MAM 配置是:
mod_mam:
iqdisc: one_queue
default: always
assume_mam_usage: true
我没有更改 mod_offline 配置。
提示:执行此操作时,还需要 mod_ping 和 mod_stream_mgmt 来检测丢失的连接并终止会话,以便 mod_offline 捕获离线消息并重新发送到妈妈。
基本场景
Bob 离线,Alice 作为客户端使用 Conversations 1.23.8 向他发送消息。服务器是 运行 debian 上的 ejabberd 18.01。
当
时,Bob 被视为离线ejabberdctl connected_users
没有列出他的名字。
然后消息被ejabberd存储在离线消息存储中。这是由以下人员检查的:
ejabberdctl get_offline_count bob example.com
在/etc/ejabberd/ejabberd.yml
中配置mod_offline:
access:
max_user_offline_messages:
admin: 5000
all: 100
...
modules:
mod_offline:
access_max_user_messages: max_user_offline_messages
...
案例A:
Bob 使用 gajim 1.0.0 连接到服务器。他收到离线消息和
ejabberdctl get_offline_count bob example.com
returns 0(在他连接之前是 >0)并且日志 (/var/log/ejabberd/ejabberd.log
) 说:
2018-03-24 17:32:10.132 [debug] <0.4422.0>@xmpp_socket:send:218 (tls|<0.4422.0>) Send XML on stream = <<"<message xml:lang='en' to='bob@example.com/gajim.8FNGJDH5' from='alice@example.com/phone' type='chat' id='643ah4c3-8920-4c52-82b1-89s6f759vff7'><request xmlns='urn:xmpp:receipts'/><markable xmlns='urn:xmpp:chat-markers:0'/><origin-id xmlns='urn:xmpp:sid:0' id='643ah4c3-8920-4c52-82b1-89s6f759vff7'/><active xmlns='http://jabber.org/protocol/chatstates'/><delay from='example.com' stamp='2018-03-24T16:31:54.745016Z' xmlns='urn:xmpp:delay'>Offline storage</delay><body>This is my message.</body></message>">>
到目前为止,还不错。
案例 B:
Bob 使用 Conversations 1.23.8 连接到服务器。他没有收到离线消息,但是
ejabberdctl get_offline_count bob example.com
returns 0 无论如何(在他连接之前它是 >0)并且日志 (/var/log/ejabberd/ejabberd.log
) 没有像案例 A 中那样的条目。
问题:
我已经为此工作了几天。我查看了服务器的配置以及客户端的配置。根据我的经验,我会说这是 Conversations 客户端的问题,但我现在不知道去哪里找。我应该在 ejabberd.log 中查找什么日志消息?
Conversations 1.23.8 似乎不支持离线消息 (XEP-0160),但它支持消息存档管理 (MAM - XEP-0313)。
我现在的解决方案是将离线消息重定向到 MAM,客户端在连接到服务器时与他们的妈妈同步。提示:默认情况下,MAM 在 ejabberd 18.01 中是禁用的。
我的 MAM 配置是:
mod_mam:
iqdisc: one_queue
default: always
assume_mam_usage: true
我没有更改 mod_offline 配置。
提示:执行此操作时,还需要 mod_ping 和 mod_stream_mgmt 来检测丢失的连接并终止会话,以便 mod_offline 捕获离线消息并重新发送到妈妈。