66f18a084a
- 新增 shuttingDown 原子布尔标志和 shutdownOnce 保证单次执行 - 添加 DrainTimeout 和 ShutdownTimeout 配置参数,默认 5s 和 30s - 修改 ServeHTTP 拦截新请求返回 503 Service Unavailable - 实现跨平台信号处理:Windows 关窗口和 Linux SIGTERM/SIGINT - 添加 recover 保护避免停机过程中 panic 触发重启 - 优化 HTTP 服务退出判断,排除正常关闭情况 - 新增 log.LoggerNoCaller 用于访问日志等无意义调用方场景 - 更新 README 文档增加优雅停机特性说明和文档链接 - 创建详细的优雅停机文档和测试用例 - 添加 Windows 平台特定信号处理实现 - 新增 .cursor 计划文件记录开发方案
32 lines
1.0 KiB
Go
32 lines
1.0 KiB
Go
//go:build windows
|
|
|
|
package hotime
|
|
|
|
import (
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
var kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
var procSetConsoleCtrlHandler = kernel32.NewProc("SetConsoleCtrlHandler")
|
|
|
|
// registerWindowsCloseHandler 注册 Windows 控制台关闭事件处理器,
|
|
// 捕获用户点击控制台 X 按钮、系统注销/关机等事件,触发优雅停机。
|
|
//
|
|
// Windows 在 CTRL_CLOSE_EVENT 后约 5 秒会强制结束进程,
|
|
// 因此此路径使用更短的 drain(2s)+shutdown(3s),总计 <5s。
|
|
// 对于需要更长时间的场景,请改用 taskkill /PID 或 Ctrl+C。
|
|
func (that *Application) registerWindowsCloseHandler() {
|
|
handler := func(ctrl uintptr) uintptr {
|
|
switch ctrl {
|
|
case 2, 5, 6: // CTRL_CLOSE_EVENT=2, CTRL_LOGOFF_EVENT=5, CTRL_SHUTDOWN_EVENT=6
|
|
that.initiateGracefulShutdown(2*time.Second, 3*time.Second)
|
|
time.Sleep(6 * time.Second)
|
|
return 1 // TRUE, 已处理
|
|
}
|
|
return 0 // FALSE, 交给下一个 handler
|
|
}
|
|
|
|
procSetConsoleCtrlHandler.Call(syscall.NewCallback(handler), 1)
|
|
}
|