2015-06-26 107 views
3

您好,我正在使用Node.js集羣模塊運行我的應用程序,並試圖找到一種優雅地退出工作程序而不丟失任何請求的方式。Node.js:知道所有http請求何時完成

因此,我使用server.close()停止接受新請求,但如何知道正在處理的實際請求是否已完成?

我想出了這個技巧的正常工作:

var http = require('http'); 

var server = http.createServer(function(res, req) { 
    setTimeout(function() { // simulate a request which takes time (1sec) to finish        
    req.end('hallo'); 
    }, 1000); 
}).listen(8080); 

server._requests = 0; 
server.on('request', function(req, res) { 
    server._requests += 1; 
    res.once('finish', function() { 
    server._requests -= 1; 
    if (server._requests === 0) 
     server.emit('no_more_requests'); 
    }); 
}); 

function gracefulExit() { 
    server.close(); 
    if (server._requests === 0) process.exit(0); // exit right away 
    server.once('no_more_requests', process.exit); // or wait 
} 

process.on('SIGTERM', gracefulExit); 
process.on('SIGINT', gracefulExit); 

但有這樣做的更優雅的方式?

+0

如果您可以使用Ajax調用請求,則可以使用$(document).ajaxStart和$(document).ajaxStop檢查進程請求是否完成 –

回答

0

您不必手動關閉服務器。相反,你可以unref()服務器。這告訴節點,只要這個服務器對象不再被使用,並且沒有其他類似的資源在使用,那麼該進程就可以退出。

查看nodejs server.unref() doc瞭解更多詳情。

請注意,您不能立即執行此操作,因爲您的服務器將啓動並且在處理任何請求之前該進程將退出。相反,在服務器運行後,您需要在將來某個時間決定,然後您想要server.unref()並讓它關閉。

請注意,node.js中的計時器具有相同的功能,因此您可以決定計時器是否應使處理繼續運行。

相關問題