与nodeJS的套接字挂起/ ETIMEDOUT异常

时间:2016-02-19 18:09:26

标签: node.js

我意识到在这个话题上已经说了很多,但我相信我正在关闭我的联系,并希望有一双新的眼睛告诉我,如果我错过了什么。

  • 创建包含请求信息的对象并将其传递给throttle
  • throttle将它放在堆栈上并启动一个间隔计时器,每1200毫秒调用process_queue; get_info作为请求回调传递。
  • 在某些时候(变化)执行期间,套接字挂断并且连接ETIMEDOUT 异常被抛出,此时我重新排队待处理请求,等待一小段时间,并再次启动process_queue。

这在早期工作正常,但异常的出现似乎随着时间的推移而加速,实际上,如果我正确地关闭它们,它们不应该发生。

非常感谢任何反馈。

var timer         = null;
var takeabreather = null;
var stack         = [];
var pendingqueue  = [];

function throttle(item) {
    stack.push(item);
    pendingqueue.push(item);
    if (timer === null) {
      timer = setInterval(process_queue, 1200);
    }
}

function process_queue() {
    var item = stack.shift();
    var req  = http.request(item.opts, get_info);

    req.on('error', function(e) {
        logger.error('--- PROCESS_QUEUE: ERROR: ' + e);
        req.end();
    });

    req.end(function(){
      logger.debug('PROCESS_QUEUE: ENDING...');
    })

    // clear timer is there is no work left to do...
    if (stack.length === 0) {
        clearInterval(timer);
        timer = null;
        logger.info('PROCESS_QUEUE: queue is empty');
    }
}

function get_info(response) {
    var body = '';

    response.on('data', function(d) {
        body += d;
    });

    response.on('end', function() {
        var parsed  = JSON.parse(body);
        var doc     = {};
        parsed.forEach(function (item) {
            try {
                doc.name = item.name;
            }
            catch (err) {
                logger.error('--- GET_INFO ERROR: ', response.req.path, err);
            }
        });
        // code to remove item from pending queue redacted //
        logger.debug('--- GET_INFO END: ', response.req.path);
    });
}

process.on('uncaughtException', function (e) {
  logger.error('--- UNCAUGHT_EXCEPTION: ' + e);
  clearInterval(timer);
  timer = null;
  if (takeabreather === null ) {
      logger.warn('--- REQUEUING...');
      stack = pendingqueue;
      logger.warn('--- TAKING A BREATHER...' );
      takeabreather = setTimeout(process_queue, 10000);
  }
});

1 个答案:

答案 0 :(得分:0)

事实证明,http.request中的嵌套get_info未通过.end()

关闭