Gracefull shutdown WEB UI microservice

This commit is contained in:
Igor Kulikov 2022-07-07 15:25:23 +03:00
parent 3ff3ccd1dc
commit addba55cf8
2 changed files with 33 additions and 13 deletions

View File

@ -26,4 +26,5 @@ source "${CONF_FOLDER}/${configfile}"
cd ${pkg.installFolder} cd ${pkg.installFolder}
exec /bin/sh -c "node server.js" # This will forward this PID 1 to the node.js and forward SIGTERM for graceful shutdown as well
exec node server.js

View File

@ -22,10 +22,12 @@ import http, { ServerResponse } from 'http';
import httpProxy from 'http-proxy'; import httpProxy from 'http-proxy';
import compression from 'compression'; import compression from 'compression';
import historyApiFallback from 'connect-history-api-fallback'; import historyApiFallback from 'connect-history-api-fallback';
import { Socket } from 'net';
const logger = _logger('main'); const logger = _logger('main');
let server: http.Server | null; let server: http.Server | null;
let connections: Socket[] = [];
(async() => { (async() => {
try { try {
@ -102,34 +104,51 @@ let server: http.Server | null;
server.listen(bindPort, bindAddress, () => { server.listen(bindPort, bindAddress, () => {
logger.info('==> 🌎 Listening on port %s.', bindPort); logger.info('==> 🌎 Listening on port %s.', bindPort);
logger.info('Started ThingsBoard Web UI Microservice.'); logger.info('Started ThingsBoard Web UI Microservice.');
}).on('error', (error) => { }).on('error', async (error) => {
logger.error('Failed to start ThingsBoard Web UI Microservice: %s', error.message); logger.error('Failed to start ThingsBoard Web UI Microservice: %s', error.message);
logger.error(error.stack); logger.error(error.stack);
exit(-1); await exit(-1);
});
server.on('connection', connection => {
connections.push(connection);
connection.on('close', () => connections = connections.filter(curr => curr !== connection));
}); });
} catch (e: any) { } catch (e: any) {
logger.error('Failed to start ThingsBoard Web UI Microservice: %s', e.message); logger.error('Failed to start ThingsBoard Web UI Microservice: %s', e.message);
logger.error(e.stack); logger.error(e.stack);
exit(-1); await exit(-1);
} }
})(); })();
process.on('exit', () => { [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`].forEach((eventType) => {
exit(0); process.on(eventType, async () => {
logger.info(`${eventType} signal received`);
await exit(0);
});
})
process.on('exit', async (code: number) => {
logger.info(`ThingsBoard Web UI Microservice has been stopped. Exit code: ${code}.`);
}); });
function exit(status: number) { async function exit(status: number) {
logger.info('Exiting with status: %d ...', status); logger.info('Exiting with status: %d ...', status);
if (server) { if (server) {
logger.info('Stopping HTTP Server...'); logger.info('Stopping HTTP Server...');
connections.forEach(curr => curr.end(() => curr.destroy()));
const _server = server; const _server = server;
server = null; server = null;
_server.close(() => { const serverClosePromise = new Promise<void>(
logger.info('HTTP Server stopped.'); (resolve, reject) => {
process.exit(status); _server.close((err) => {
}); logger.info('HTTP Server stopped.');
} else { resolve();
process.exit(status); });
}
);
await serverClosePromise;
} }
process.exit(status);
} }