import { Injectable, Logger, OnApplicationShutdown, OnModuleInit, } from "@nestjs/common"; import { closeDb } from "../../config/database.js"; const SERVICE_NAME = "classes"; /** * 优雅停机服务。 * * 信号处理由 NestJS 在 `app.listen` 之前调用 `app.enableShutdownHooks()` * 触发(SIGTERM / SIGINT),NestJS 会依次调用 OnApplicationShutdown 钩子。 * K8s 配置 `terminationGracePeriodSeconds=60` 给予足够时间清理。 * * Classes 服务仅使用 Drizzle ORM(MySQL),无 Kafka / Redis 依赖。 * 关闭时仅需关闭数据库连接池。 */ @Injectable() export class LifecycleService implements OnModuleInit, OnApplicationShutdown { private readonly logger = new Logger(LifecycleService.name); onModuleInit(): void { this.logger.log(`service ${SERVICE_NAME} module initialized`); } async onApplicationShutdown(signal?: string): Promise { this.logger.log( `service ${SERVICE_NAME} shutting down (signal=${signal ?? "unknown"})`, ); try { await closeDb(); this.logger.log("database connection closed"); } catch (error) { this.logger.error( `database close failed: ${error instanceof Error ? error.message : String(error)}`, ); } this.logger.log(`service ${SERVICE_NAME} shutdown complete`); } }