Files
order_site/apps/backend/src/startup/shutdown.ts
T
zhaoxing 341f8b2000 feat(consignment): 自动匹配改为进入待抢单前一次性匹配
1) 配置改为开启自动匹配 + 匹配订单生效时间,移除内部匹配等待与定时轮询;2) 所有进入待抢单的路径统一先自动匹配一次,未命中进大厅;3) 手动匹配仅允许待抢单;4) 新增迁移 160 回填配置并迁移存量 internal_matching。
2026-11-13 13:25:05 +08:00

58 lines
1.4 KiB
TypeScript

import type { Server } from 'node:http'
import { stopKuaishouIndustrySendCallbackRetryWorker } from '../services/platforms/kuaishou-industry/send-code-service.js'
import { stopScheduledJobs } from '../services/scheduler/scheduler-service.js'
import { closeDb } from '../db/client.js'
import { logError, logInfo } from '../utils/logger.js'
import type { StartupState } from './state.js'
type ShutdownOptions = {
closeDatabase?: () => Promise<void>
}
export function createShutdownController(
server: Server,
startupState: StartupState,
{ closeDatabase = closeDb }: ShutdownOptions = {},
) {
let shutdownStarted = false
async function shutdown(signal: string) {
if (shutdownStarted) {
return
}
shutdownStarted = true
startupState.phase = 'shutting_down'
logInfo('[shutdown]', `received ${signal}, closing HTTP server`)
stopScheduledJobs()
stopKuaishouIndustrySendCallbackRetryWorker()
if (server.listening) {
await new Promise<void>((resolve) => {
server.close((error) => {
if (error) {
logError('[shutdown]', 'failed to close HTTP server', error)
process.exitCode = 1
}
resolve()
})
})
}
try {
await closeDatabase()
} catch (error) {
logError('[shutdown]', 'failed to close database pool', error)
process.exitCode = 1
}
}
return {
isShutdownStarted: () => shutdownStarted,
shutdown,
}
}