candy/strophe - 使用 prebind (.attach) 会导致紧密的空闲循环?

Posted

技术标签:

【中文标题】candy/strophe - 使用 prebind (.attach) 会导致紧密的空闲循环?【英文标题】:candy/strophe -- using prebind (.attach) results in tight idle loop? 【发布时间】:2014-09-17 17:23:18 【问题描述】:

我正在使用 Candy.js (v1.7.1) 和 Openfire v3.9.3。运行 Candy 包中包含的示例 index.html,我使用直接身份验证(浏览器提示输入 jid/pwd)没有问题。但是,如果我在执行服务器端预绑定(uisng MatriX)之后将示例更改为使用 Candy.Core.attach(几乎是 Strophe.Connection.attach 的直通),我似乎陷入了某种空闲循环每秒 3 次向 XMPP 服务器发送空消息。

任何想法是什么导致了这种循环以及为什么我使用 Candy.Core.attach 时没有出现演示 Candy UI?

修改后的示例...

$(document).ready(function() 
    var httpbindUrl = 'http://xmpp.mydomain.net:7070/http-bind/';
    var chatRoom = 'testroom@conference.mydomain.net';

    // These values come from a REST call to our services that perform
    // the prebind authentication (using MatriX, obviously)
    var jid = 'someuser@mydomain.net/MatriX';
    var sid = 'b95ffa4';  // must be a string despite what candy's doc say
    var rid = 1983626985;

    Candy.init(httpbindUrl, 
        core: 
            debug: true,
            autojoin: [chatRoom]
        ,
        view:  assets: './res/' 
    );

    Candy.Core.attach(jid, sid, rid); // this seems to cause some sort of looping to occur
    // Candy.Core.connect('someuser@mydomain.net', 'password'); // <-- this works as expected
    );

浏览器的控制台日志显示...

POST http://xmpp.mydomain.net:7070/http-bind/ [HTTP/1.1 200 OK 895ms]
POST http://xmpp.mydomain.net:7070/http-bind/ [HTTP/1.1 200 OK 491ms]
POST http://xmpp.mydomain.net:7070/http-bind/ [HTTP/1.1 200 OK 483ms]
"RECV: <body xmlns='http://jabber.org/protocol/httpbind' ack='1983626985'/>" candy.bundle.js:159
"LIBS:<1>: no requests during idle cycle, sending blank request" libs.bundle.js:1192
"LIBS:<0>: request id 4.0 posting" libs.bundle.js:1192
"LIBS:<0>: request id 4.0 state changed to 1" libs.bundle.js:1192
"SENT: <body rid='1983626986' xmlns='http://jabber.org/protocol/httpbind' sid='b95ffa4'/>" candy.bundle.js:159
POST http://xmpp.mydomain.net:7070/http-bind/ [HTTP/1.1 200 OK 436ms]
"LIBS:<0>: request id 4.1 state changed to 2" libs.bundle.js:1192
"LIBS:<0>: request id 4.1 state changed to 3" libs.bundle.js:1192
"LIBS:<0>: request id 4.1 state changed to 4" libs.bundle.js:1192
"LIBS:<0>: removing request" libs.bundle.js:1192
"LIBS:<0>: _throttledRequestHandler called with 0 requests" libs.bundle.js:1192
"LIBS:<0>: request id 4 should now be removed" libs.bundle.js:1192
"LIBS:<0>: request id 4.1 got 200" libs.bundle.js:1192
"LIBS:<1>: _dataRecv called" libs.bundle.js:1192
"RECV: <body xmlns='http://jabber.org/protocol/httpbind' ack='1983626986'/>" candy.bundle.js:159
"LIBS:<1>: no requests during idle cycle, sending blank request" libs.bundle.js:1192
"LIBS:<0>: request id 5.0 posting" libs.bundle.js:1192
"LIBS:<0>: request id 5.0 state changed to 1" libs.bundle.js:1192
"SENT: <body rid='1983626987' xmlns='http://jabber.org/protocol/httpbind' sid='b95ffa4'/>" candy.bundle.js:159
...continues in a similar pattern until I close the browser window.

注意:以“LIBS:”开头的条目来自 strophe 的低级日志记录(级别、味精)。还应该注意的是,糖果演示将 strophe.js 包装成一个更大的包,称为 libs.bundle.js。

【问题讨论】:

在下面查看我的自我回答。 【参考方案1】:

通常,当您连接到 BOSH 连接管理器时,您可以在第一节(会话创建请求)上设置 wait 属性。

XEP-0124 Session Creation Response

Strophe 和 Candy 使用的默认值是 60。您能否确认 MatriX 在建立 BOSH 会话时使用的值?

例如:

<body content='text/xml; charset=utf-8'
  from='user@example.com'
  hold='1'
  rid='1573741820'
  to='example.com'
  route='xmpp:example.com:9999'
  wait='60'
  xml:lang='en'
  xmpp:version='1.0'
  xmlns='http://jabber.org/protocol/httpbind'
  xmlns:xmpp='urn:xmpp:xbosh'/>

【讨论】:

我有,但上面的日志 sn-p 中没有显示。我会仔细检查。 已确认。等待=60,保持=1,窗口=5 您提到当您直接从客户端连接时一切正常,如果问题仅在服务器端建立会话时出现,是否可以查看从 MatriX 发送的节的日志? @fpsColton,我在这里问一个题外话。您对this question 有任何线索吗?我还需要获取用户昵称。或者有没有办法强制openfire(及其相关插件)在基于XEP-0172的初始节中包含昵称。 @UlukBiy,对不起,我没有给你任何建议.. 过去我不得不求助于一些相当臭的代码,以了解是否允许我访问会员- 只有 MUC 与 Openfire,因为它根本无法满足我对成员列表的请求(即使 XEP 说它应该)。我认为 XMPP 的任何实现都不是 100%。【参考方案2】:

Openfire v3.9.3 BOSH 实现似乎“古怪”。 MatriX 开发人员能够解决这个问题。从 MatriX v1.6.0.1 开始,该场景已解决。

【讨论】:

以上是关于candy/strophe - 使用 prebind (.attach) 会导致紧密的空闲循环?的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份