2015-03-02 52 views
0

我试图在中优雅地关闭node.js使用express 4.x http服务器。在node.js/express中异步关闭异步作业

关闭快速服务器很简单,但是我担心的是我们有很多异步作业。流程的一个例子:

  1. 接收请求
  2. 做一些东西
  3. 发送响应返回给客户端
  4. 在后台继续做相关的这一请求喜欢做的另一请求一些第三部分异步的东西部分服务
  5. 接收从第三部分的服务响应并保存响应于数据库等
  6. 完成

所以,如果我做我的正常关闭这样的代码:

process.on('SIGTERM', function() { 
    serverInstance.close(function(){ 
     closeConnectionToDatabases(function(){ 
      process.exit(0); 
     }) 
    }); 

    // shutdown anyway after some time 
    setTimeout(function(){ 
     process.exit(0); 
    }, 8000); 
}); 

我怎么能相信,如果SIGTERM已第一步和第二步中流动上述解释之间发生的一切都还好吗?第四步,第五步和第六步呢?有没有什么好的方法来处理这个问题呢,还是仅仅是手动监视从你的服务以异步方式发出的所有请求并等待它们?

感谢, 伊万

+0

这是去年三月......我可以问你什么结束了做? – Merc 2016-03-13 01:28:18

回答

1

process.exit()将终止立即node.js过程,而无需等待所有aync任务完成。

如果您想要真正的正常关机,则应手动关闭所有资源(所有打开的连接和文件描述符),而不是调用process.exit()。在这种情况下,node.js将在完成所有待处理的异步任务后立即终止。

所以,只要关闭所有的数据库连接和其他I/O资源:

process.on('SIGTERM', function() { 
    serverInstance.close(function(){ 
     closeConnectionToDatabases(function(){ 
      // now node.js should close automatically 
     }) 
    }); 

    // shutdown anyway after some time 
    setTimeout(function(){ 
     process.exit(0); 
    }, 8000); 
}); 
+1

不幸的是,这是一个无法回答的问题。不是特意指责你 - 我现在正在处理同样的问题,并且很惊讶似乎没有人会回答这个问题...... – Merc 2016-03-13 01:27:58