2015-06-26 6 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, поэтому вы можете решить, должен ли таймер поддерживать вашу обработку или нет.

Смежные вопросы