Salesforce Streaming API:会话到期后重新连接到Cometd

时间:2013-08-16 16:37:42

标签: javascript salesforce cometd

在旧会话过期后重启cometd会话的最佳方法是什么?特别是在使用CometD Javascript库和Salesforce Streaming API时。

目前我正在尝试编写一系列使用Comeforce运行的Salesforce Streaming API的网页,以自动更新页面上的数据。这工作正常,但我现在正试图处理会话到期后要做的事情。

目前我正在非常短的时间内进行测试,特别是20秒。我将下面的代码调用两次。首先加载页面,然后再加载20秒。

$.cometd.clearListeners();
$.cometd.init({
                url:window.location.protocol+'//'+window.location.hostname+'/cometd/28.0/',
                requestHeaders: { Authorization: 'OAuth {!$Api.Session_ID}'}
            });
            [Initialize Subscriptions]

这可行,但不是没有我想避免的一些问题。

看起来如果我在上面的代码第二次运行之前通过我的订阅接到一个电话,我的订阅处理程序会在它捕获的下一个调用中触发两次。我已经尝试用$ .cometd.handshake替换$ .cometd.init,但除非我的订阅在第二次调用上面的代码之前收到了一个调用,否则这似乎永远不会有效。我也尝试过调用$ .cometd.disconnect,但是在调用该函数之后,这似乎阻止了任何调用到达我的订阅,即使我同步运行它。

我做得对吗?20秒的时间间隔搞乱了,还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

我正在回答CometD的观点。

在旧的会话过期后重启CometD会话的最佳方法是什么都不做。

CometD具有自动重新连接功能,因此如果网络连接断开并且会话过期,CometD将自动重试,直到它再次成功与服务器连接,并且尝试之间有一个退避间隔。

为了保证您的订阅在重新握手时恢复,您只需关注the guidelines,特别是从/meta/handshake成功的听众执行订阅。

如果要在断开连接时测试JavaScript代码行为,只需创建断开连接,而不是两次调用cometd.init()。 您可以终止服务器,拔掉网络电缆,取消部署Web应用程序等。

如果明确断开客户端连接,则必须手动重新握手:

cometd.init(...);
...

// Disconnect
cometd.disconnect();
// Wait a while, then re-handshake
cometd.handshake();

请注意,必须“等待一段时间”,因为cometd.disconnect()是异步的。 或者,你可以这样做:

cometd.init(...);
...

// Disconnect and re-handshake when fully disconnected
cometd.addListener('/meta/disconnect', function(message) 
{ 
    cometd.handshake(); 
});
cometd.disconnect();

// Another solution, using setTimeout()
cometd.disconnect();
window.setTimeout(function() 
{ 
    cometd.handshake(); 
}, 5000);