我最近使用 Ejabberd 开发了一个即时消息网站,似乎有些消息被发送了两次。以下是情况的详细信息。
用户 A 向用户 B 发送了多条消息,格式为:
<body rid='1874291086' xmlns='http://jabber.org/protocol/httpbind' sid='33549457dc8ad98caceedbb648178f26683fcf8a'> <message to='284@ejabberd' from='282@ejabberd' type='chat' xmlns='jabber:client' id='efdf6155-a661-46eb-9b54-88b2790f492a'> <body>1</body> <data timestamp='1501136608657'/> <request xmlns='urn:xmpp:receipts'/></message> </body>
当 B 收到消息时,返回:
<body xmlns='http://jabber.org/protocol/httpbind'> <message xmlns='jabber:client' xml:lang='en' to='282@ejabberd/9495456281346940375146' from='284@ejabberd/12680356801999428401210' id='5b1d7c22-381c-4332-a4c9-bc9443a9d296'> <received xmlns='urn:xmpp:receipts' id='efdf6155-a661-46eb-9b54-88b2790f492a'/> </message> </body>
几分钟后,任一客户端都会收到:
<body xmlns='http://jabber.org/protocol/httpbind'> <presence xmlns='jabber:client' to='282@ejabberd/13236655690203912299484' from='282@ejabberd/964025387189976270180' type='unavailable'> <status xml:lang='en'>Connection failed: connection closed</status> </presence> </body>
收到上述消息的客户端将发送 ping
<body rid='872290555' xmlns='http://jabber.org/protocol/httpbind' sid='cc0604ed5e728d88216c3bb9124fc39ed574cf5b'/>
并且该客户端将再次收到之前发送给它的所有消息
<body xmlns='http://jabber.org/protocol/httpbind'><message xmlns='jabber:client' xml:lang='en' to='282@ejabberd/13236655690203912299484' from='284@ejabberd/17094073157455939286404' type='chat'> <composing xmlns='http://jabber.org/protocol/chatstates'/></message> ... all the messages ... </body>
我正在使用 Strophe 和 Ejabberd 17.04,使用 http-bind 从 5280 端口连接,禁用 mod_mam 和 mod_muc。我确实有来自 Ejabberd 的日志,但它非常大,如果需要我可以提供。
每次客户端失去连接时,消息都会重新发送,并且发送给用户的每一条消息都将再次传递。
我有几天烦人的问题,任何建议将不胜感激。感谢您的时间:)