feat(core): Unify application components shutdown (#8097)
## Summary Add `ShutdownService` and `OnShutdown` decorator for more unified way to shutdown different components. Use this new way in the following components: - HTTP(S) server - Pruning service - Push connection - License --------- Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
This commit is contained in:
@@ -22,6 +22,7 @@ import { ExternalSecretsManager } from '@/ExternalSecrets/ExternalSecretsManager
|
||||
import { initExpressionEvaluator } from '@/ExpressionEvaluator';
|
||||
import { generateHostInstanceId } from '@db/utils/generators';
|
||||
import { WorkflowHistoryManager } from '@/workflows/workflowHistory/workflowHistoryManager.ee';
|
||||
import { ShutdownService } from '@/shutdown/Shutdown.service';
|
||||
|
||||
export abstract class BaseCommand extends Command {
|
||||
protected logger = Container.get(Logger);
|
||||
@@ -38,7 +39,7 @@ export abstract class BaseCommand extends Command {
|
||||
|
||||
protected server?: AbstractServer;
|
||||
|
||||
protected isShuttingDown = false;
|
||||
protected shutdownService: ShutdownService = Container.get(ShutdownService);
|
||||
|
||||
/**
|
||||
* How long to wait for graceful shutdown before force killing the process.
|
||||
@@ -309,7 +310,7 @@ export abstract class BaseCommand extends Command {
|
||||
|
||||
private onTerminationSignal(signal: string) {
|
||||
return async () => {
|
||||
if (this.isShuttingDown) {
|
||||
if (this.shutdownService.isShuttingDown()) {
|
||||
this.logger.info(`Received ${signal}. Already shutting down...`);
|
||||
return;
|
||||
}
|
||||
@@ -323,9 +324,9 @@ export abstract class BaseCommand extends Command {
|
||||
}, this.gracefulShutdownTimeoutInS * 1000);
|
||||
|
||||
this.logger.info(`Received ${signal}. Shutting down...`);
|
||||
this.isShuttingDown = true;
|
||||
this.shutdownService.shutdown();
|
||||
|
||||
await this.stopProcess();
|
||||
await Promise.all([this.stopProcess(), this.shutdownService.waitForShutdown()]);
|
||||
|
||||
clearTimeout(forceShutdownTimer);
|
||||
};
|
||||
|
||||
@@ -63,7 +63,7 @@ export class Start extends BaseCommand {
|
||||
|
||||
protected activeWorkflowRunner: ActiveWorkflowRunner;
|
||||
|
||||
protected server = new Server();
|
||||
protected server = Container.get(Server);
|
||||
|
||||
private pruningService: PruningService;
|
||||
|
||||
@@ -101,14 +101,6 @@ export class Start extends BaseCommand {
|
||||
|
||||
await this.externalHooks?.run('n8n.stop', []);
|
||||
|
||||
// Shut down License manager to unclaim any floating entitlements
|
||||
// Note: While this saves a new license cert to DB, the previous entitlements are still kept in memory so that the shutdown process can complete
|
||||
await Container.get(License).shutdown();
|
||||
|
||||
if (this.pruningService.isPruningEnabled()) {
|
||||
this.pruningService.stopPruning();
|
||||
}
|
||||
|
||||
if (Container.get(MultiMainSetup).isEnabled) {
|
||||
await this.activeWorkflowRunner.removeAllTriggerAndPollerBasedWorkflows();
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ export class Webhook extends BaseCommand {
|
||||
help: flags.help({ char: 'h' }),
|
||||
};
|
||||
|
||||
protected server = new WebhookServer();
|
||||
protected server = Container.get(WebhookServer);
|
||||
|
||||
constructor(argv: string[], cmdConfig: IConfig) {
|
||||
super(argv, cmdConfig);
|
||||
|
||||
Reference in New Issue
Block a user