空闲时间后关闭监听器

时间:2013-11-12 14:19:29

标签: node.js express

我有一个自动启动的简单服务器。

它使用来托管端点,该端点以简单的app.listen(port);命令启动。

由于我是自动启动,我想在闲置一段时间后关闭服务器 - 比如3分钟。

我只是使用下面的函数手动编码,每个app.post都会调用它:

//Idle timer
var timer;
function resetIdleTimer() {

    if (timer != null) clearTimeout(timer);

    timer = setTimeout(function () {
        logger.info('idle shutdown');
        process.exit();
    }, 3 * 60 * 1000);

}

这看起来有点粗糙,所以我想知道是否有更简洁的方式(express内的某种计时器)。

查看快速文档,我没有看到一种简单的方法来配置它。

有没有更简洁的方法来实现这种空闲关闭?

3 个答案:

答案 0 :(得分:2)

app.listen()会返回一个包装过的HTTP服务器(如in the source所示),然后您可以.close() method

var app = express();
var server = app.listen(port);
setTimeout(function() {
  server.close();
}, 3 * 60 * 1000);

这将阻止服务器接受新连接。当它停止提供现有连接时,它将正常停止。这将完全停止Nodej。

编辑:您可能还会发现此GitHub issue相关。

答案 1 :(得分:0)

看看forever。您可以将它作为模块放入应用程序中,它为您提供了一些可以帮助您实现所需内容的功能(例如forever.stop(index),它终止在该索引上运行的节点进程。在终止进程之前,你可以检索进程列表并操纵字符串以获得正常运行时间。然后,我会监视服务器调用之间的时间。如果请求之间有3分钟的间隔,我会调用forever.stop()为了终止这个过程。

答案 2 :(得分:0)

我不认为使用你的计时器解决方案是“粗暴的”;我会采取稍微不同的方法:

app.timeOutDate = new Date().valueOf() + 1000*60*3; // 3 minutes from now, in ms

function quitIfTimedout(req, res, next){
  if(new Date().valueOf() > app.timeOutDate){
    logger.info('idle shutdown');
    process.exit();
  } else {
    app.timeOutDate = new Date().valueOf() + 1000*60*3; //reset
    next();
  }
};

app.all('*', quitIfTimedout);

然而,3分钟后它实际上不会退出,它会在3分钟后退出下一个请求。这可能无法解决您的问题