3

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

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

目前我正在一个非常小的时间范围内进行测试,特别是 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秒的间隔把事情搞砸了,还是有更好的方法来做到这一点?

4

1 回答 1

2

我是从CometD的角度来回答的。

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

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

为了保证您的订阅在重新握手时恢复,您只需要遵循指南,特别是从/meta/handshake成功的侦听器执行您的订阅。

如果您想在断开连接的情况下测试您的 JavaScript 代码行为,您只需要创建断开连接,而不是调用cometd.init()两次。你可以杀掉服务器、拔掉网线、取消部署webapp等等。

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

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);
于 2013-08-16T23:21:03.653 回答