Здравствуйте, я запускаю свое приложение с модулем кластера 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);
Но есть более элегантный способ сделать это?
Если вы можете использовать вызовы Ajax для запроса, вы можете использовать $ (document) .ajaxStart и $ (document) .ajaxStop, чтобы проверить, завершен ли запрос процесса или нет –