Gracefull shutdown WEB UI microservice
This commit is contained in:
parent
3ff3ccd1dc
commit
addba55cf8
@ -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
|
||||||
|
|||||||
@ -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>(
|
||||||
|
(resolve, reject) => {
|
||||||
|
_server.close((err) => {
|
||||||
logger.info('HTTP Server stopped.');
|
logger.info('HTTP Server stopped.');
|
||||||
process.exit(status);
|
resolve();
|
||||||
});
|
});
|
||||||
} else {
|
}
|
||||||
|
);
|
||||||
|
await serverClosePromise;
|
||||||
|
}
|
||||||
process.exit(status);
|
process.exit(status);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user