2026-05-12 23:18:31 +08:00
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"apigo.cc/go/log"
|
|
|
|
|
"sync"
|
|
|
|
|
)
|
|
|
|
|
|
2026-06-04 18:16:46 +08:00
|
|
|
type reloadHook struct {
|
|
|
|
|
hooks []func() error
|
|
|
|
|
lock sync.RWMutex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var globalReloadHook = &reloadHook{}
|
2026-05-12 23:18:31 +08:00
|
|
|
|
|
|
|
|
// OnReload 注册一个在接收到 SIGHUP 信号时触发的重新加载钩子
|
|
|
|
|
func OnReload(handler func() error) {
|
2026-06-04 18:16:46 +08:00
|
|
|
DefaultServer.OnReload(handler)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ws *webServer) OnReload(handler func() error) {
|
|
|
|
|
globalReloadHook.lock.Lock()
|
|
|
|
|
defer globalReloadHook.lock.Unlock()
|
|
|
|
|
globalReloadHook.hooks = append(globalReloadHook.hooks, handler)
|
2026-05-12 23:18:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// triggerReload 触发所有注册的重新加载钩子
|
2026-06-04 18:16:46 +08:00
|
|
|
func (ws *webServer) triggerReload() error {
|
|
|
|
|
globalReloadHook.lock.RLock()
|
|
|
|
|
hooks := make([]func() error, len(globalReloadHook.hooks))
|
|
|
|
|
copy(hooks, globalReloadHook.hooks)
|
|
|
|
|
globalReloadHook.lock.RUnlock()
|
2026-05-12 23:18:31 +08:00
|
|
|
|
|
|
|
|
for _, hook := range hooks {
|
|
|
|
|
if err := hook(); err != nil {
|
|
|
|
|
log.DefaultLogger.Error("reload hook failed", "error", err.Error())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|