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) }