2015-03-02 49 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