2

我正在构建一个 iOS 应用程序,但问题存在于所有客户端。iChat、Messages、Psi 等。因此,因为它存在于所有客户端上,我将假设它是服务器问题。

有没有人经历过这样的事情?如果是这样,你做了什么来修复它?我确定这是一些愚蠢的配置设置或其他东西,但我根本无法弄清楚。这是唯一看起来可能与 ejabberd.log 相关的内容:

=ERROR REPORT==== 2012-09-05 12:07:12 ===
Mnesia(ejabberd@localhost): ** WARNING ** Mnesia is overloaded: {dump_log,
                                                             time_threshold}

提前感谢任何提示/指针。

4

3 回答 3

2

https://github.com/processone/ejabberd/blob/master/src/ejabberd_c2s.erl#L936似乎已经打了补丁。配置变量称为resource_conflict,您想要的值是setresource。

于 2012-09-27T18:41:10.733 回答
2

上述警告(可能)与您面临的问题无关。这些mnesia 事件通常发生在需要转储事务日志但之前的事务日志转储尚未完成时。

您面临的问题需要调试,您可以{log_level, 5}在里面设置ejabberd.cfg。这将为 ejabberd 启用调试日志记录。然后查看日志以找出有关您为什么会发生这种情况的任何猜测。另外,回来在这里粘贴您的日志文件详细信息,也许我们将能够为您提供进一步的帮助。我从来没有遇到过 ejabberd 这样无意义的问题。

日志文件附件后更新:

正如乔在下面所写的,这确实是由于资源冲突而发生的。您的两个客户正在尝试使用相同的资源值登录。但在理想世界中,这应该无关紧要。Jabber 服务器应该通过在客户端请求的资源值之上附加或预先添加自定义值来处理此问题。

例如,以下是 gtalk(甚至是 facebook 聊天)服务器将执行的操作:

SENT <iq xmlns="jabber:client" type="set" id="1"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>jaxl#resource</resource></bind></iq>
RCVD <iq id="1" type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>jabberxmpplibrary@gmail.com/jaxl#resou27F46704</jid></bind></iq>

如您所见,我的客户端请求绑定资源值jaxl#resource,但 gtalk 服务器实际上将我的会话绑定到资源值jaxl#resou27F46704。简而言之,这不是您客户端中的错误,而是 ejabberd 中的错误。

要解决此问题,您可以做两件事:

  1. 资源值可能在客户端配置中的某处硬编码。只需删除它。一个好的客户端会通过在它结束时生成一个随机资源值来自动处理这个问题。
  2. 修补 ejabberd 以表现 gtalk 服务器的行为(如上所示)。这是ejabberd_c2s.erl src 中的相关部分,需要进行一些调整。还要在c2s源文件里面搜索Replaced by new connection一下,你就会明白是怎么回事了。
于 2012-09-22T03:16:01.060 回答
1

这听起来像是您客户端中的“资源决斗”错误。您可能有两个客户端副本同时使用相同的资源运行,并且执行错误的自动重新连接逻辑。当第二个客户端登录时,第一个客户端脱机启动并出现冲突错误。第一个客户端重新登录,导致第二个客户端出现冲突错误。环形。

这方面的证据在您的日志文件中,第 3480 行:

D(<0.373.0>:ejabberd_c2s:1553) : Send XML on stream = 
  <<"<stream:error><conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
       <text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-streams'>
         Replaced by new connection
       </text>
     </stream:error>">>
于 2012-09-22T17:24:58.790 回答