我有一个异步队列工作程序在我的服务器上作为Tornado脚本运行 - 它托管了Tornado的PeriodicTask的子类,它使用来自Redis的事件。为了监视队列,我在URL上设置了一个tornado.websocket.WebSocketHandler
子类,然后将客户端WebSocket JavaScript封装在一个jQuery插件(here is the full code)中。
这个想法是,您可以在服务器上拥有多个队列,因此您可以使用jQuery模块来设置专门监视该队列的窗口小部件。目前,逻辑很简单 - 小部件仅表示在目标队列中排队了多少任务。
这是有问题的初始化代码:
/* init: */ function (_options) {
options = $.extend(options, _options);
var self = this;
self.data('recently', [0,0,0,0,0,0,0,0,0]);
self.data('options', options);
self.data('sock', null);
var sock = null;
if ('endpoint' in options && options['endpoint']) {
sock = new WebSocket(options['endpoint']);
sock.onopen = function () {};
sock.onclose = function () {};
sock.onmessage = function (e) {
var d = $.parseJSON(e.data);
if (options.queuename in d) {
var qlen = d[options.queuename]
lastvalues = self.data('recently');
lastvalues.shift();
lastvalues.push(qlen);
if (lastvalues.every(function (itm) { return itm == 0; })) {
self.each(function () {
var elem = $(this);
elem.html("<b>Currently Idle</b>");
});
} else {
self.each(function () {
var elem = $(this);
elem.html("<b>" + qlen + "</b> Queued Signals");
});
}
self.data('recently', lastvalues);
}
}
}
self.data('sock', sock);
return self.each(function () {
var elem = $(this);
elem.data('sock', sock);
});
}
javascript使用window.setInterval()
定期向套接字发送消息;服务器回复询问它的队列的状态,并且套接字的前端回调更新DOM。
但问题是:经过几分钟的这种轮询 - 专门通过在包含客户端套接字代码的页面之间导航 - ,套接字通过抛出一条带有消息的异常而失败例如DOM_ERROR_11
和套接字对象不再有效的消息。
一旦页面进入此错误状态,我必须重新启动浏览器和服务器websocket脚本才能重新启动所有内容。
...有没有比我更好的设置方法(使用window.setInterval()
和诸如此类的东西)?
答案 0 :(得分:1)
嗯,将重物附加到DOM
可能不是最好的主意您也可以使用带有套接字映射键的全局存储(可能是字典),并仅将密钥存储为DOM obj属性