github.com/sandwich-go/boost@v1.3.29/module/module.go (about) 1 package module 2 3 import ( 4 "context" 5 "os" 6 "os/signal" 7 "sync" 8 "syscall" 9 "time" 10 ) 11 12 var ( 13 processShutdownNotifyChan = make(chan struct{}) 14 processShutdownNotifyOnce sync.Once 15 processShutdownSignal os.Signal 16 ) 17 18 // ProcessShutdownNotify 进程退出信号通知 19 func ProcessShutdownNotify() chan struct{} { 20 processShutdownNotifyOnce.Do(func() { 21 c := make(chan os.Signal, 1) 22 c <- syscall.SIGHUP 23 waitIncoming := make(chan struct{}) 24 go func() { 25 <-c //读取syscall.SIGHUP 26 // os.Kill cannot be trapped 27 signal.Notify(c, os.Interrupt, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM) 28 close(waitIncoming) // 通知已经监听,防止过早退出ProcessShutdownNotify,逻辑执行在监听之前 29 processShutdownSignal = <-c 30 close(processShutdownNotifyChan) 31 }() 32 <-waitIncoming 33 }) 34 return processShutdownNotifyChan 35 } 36 37 // Plugin 插件 38 type Plugin interface { 39 // AfterRunModule 运行所有的 Module 之后被调用 40 AfterRunModule(context.Context, Master) 41 // BeforeCloseModule 关闭所有的 Module 之前被调用 42 BeforeCloseModule(context.Context, Master) 43 } 44 45 // Master Module 管理器 46 type Master interface { 47 // AttachPlugin 挂接 Plugin 48 AttachPlugin(plugins ...Plugin) 49 // Register 注册多个 Module 50 Register(ms ...Module) 51 // Stop 主动停止 Master 52 Stop(reason ...string) 53 // Run 运行入口,进程会堵塞在这里直到收到停止信号,可以指定要运行的 Module 列表 54 Run(ms ...Module) 55 // RunWithCloseTimeout 参考 Run,扩充了关闭超时支持,防止逻辑层堵塞导致进程关闭失败 56 RunWithCloseTimeout(closeTimeout time.Duration, ms ...Module) 57 // ShutdownNotify Master 停止的通知信号 58 ShutdownNotify() chan struct{} 59 // RunModule 运行一个单独的 Module 60 RunModule(md Module) 61 // Modules 获取所有的 Module 62 Modules() []Module 63 } 64 65 // Module 进程中的所有 Module 都需注册到 module 中并由其管理 66 // 模块启动时回调 OnInit,关闭时通过 closeChan 通知 Module 业务逻辑,然后回调 OnClose 67 type Module interface { 68 // OnInit 模块启动时回调 69 OnInit() 70 // OnClose Run 监听到 closeChan 返回后回调 71 OnClose() 72 // Run 需要在 Run 逻辑中监听 closeChan 通知,收到通知再返回,否则 master 会认为该 Module 已退出 73 Run(closeChan chan struct{}) 74 // Name 模块名称 75 Name() string 76 } 77 78 // defaultMaster 默认的 Master 79 var defaultMaster = New() 80 81 // AttachPlugin 挂接 Plugin 82 func AttachPlugin(plugins ...Plugin) { defaultMaster.AttachPlugin(plugins...) } 83 84 // Register 注册多个 Module 85 func Register(ms ...Module) { defaultMaster.Register(ms...) } 86 87 // Stop 主动停止 Master 88 func Stop(reason ...string) { defaultMaster.Stop(reason...) } 89 90 // Run 运行入口,进程会堵塞在这里直到收到停止信号,可以指定要运行的 Module 列表 91 func Run(ms ...Module) { defaultMaster.Run(ms...) } 92 93 // RunWithCloseTimeout 参考 Run,扩充了关闭超时支持,防止逻辑层堵塞导致进程关闭失败 94 func RunWithCloseTimeout(closeTimeout time.Duration, ms ...Module) { 95 defaultMaster.RunWithCloseTimeout(closeTimeout, ms...) 96 } 97 98 // ShutdownNotify Master 停止的通知信号 99 func ShutdownNotify() chan struct{} { return defaultMaster.ShutdownNotify() } 100 101 // RunModule 运行一个单独的 Module 102 func RunModule(md Module) { defaultMaster.RunModule(md) }