Salesforce Streaming API:在会话过期后重新连接到Comed



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

目前,我正在尝试编写一系列网页,这些网页使用Salesforce Streaming API(使用Comed运行)来自动更新页面上的数据。这很好,但我现在正在努力处理会话到期后该怎么办。

目前,我正在一个非常小的时间范围内进行测试,特别是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.cinit,但这似乎永远都不起作用,除非我的订阅在第二次调用上面的代码之前接到了电话。我也尝试过调用$.cometd.disconnect,但这似乎阻止了在我调用该函数后任何调用到达我的订阅,即使我同步运行它也是如此。

我做得对吗,20秒的间歇期把事情搞砸了,或者有更好的方法吗?

我是从彗星D的角度来回答的。

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

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

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

如果你想在断开连接的情况下测试你的JavaScript代码行为,你只需要创建断开连接,而不需要调用cometd.init()两次。你可以杀死服务器,拔下网络电缆,取消部署网络应用程序,等等。

如果你明确地断开了客户端的连接,那么你必须手动重新握手:

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);

最新更新