12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package svcfw
- import (
- "context"
- "git.swzry.com/zry/zry-go-program-framework/core"
- "os"
- "os/signal"
- )
- var _ core.ISubService = (*WatchSignalExitSubService)(nil)
- type WatchSignalExitSubService struct {
- qchan chan os.Signal
- ctx context.Context
- cncl context.CancelFunc
- SignalNotifyFunc func(sig os.Signal)
- sigList []os.Signal
- }
- func NewWatchSignalExitSubService(sig ...os.Signal) *WatchSignalExitSubService {
- r := &WatchSignalExitSubService{
- qchan: make(chan os.Signal, 0),
- sigList: sig,
- }
- return r
- }
- func NewWatchSignalExitSubServiceWithDefault() *WatchSignalExitSubService {
- r := &WatchSignalExitSubService{
- qchan: make(chan os.Signal, 0),
- sigList: []os.Signal{
- os.Interrupt,
- os.Kill,
- },
- }
- return r
- }
- func (q *WatchSignalExitSubService) Prepare(ctx *core.SubServiceContext) error {
- return nil
- }
- func (q *WatchSignalExitSubService) Run(ctx *core.SubServiceContext) error {
- signal.Notify(q.qchan, q.sigList...)
- q.ctx, q.cncl = context.WithCancel(context.Background())
- select {
- case <-q.ctx.Done():
- {
- close(q.qchan)
- return nil
- }
- case sig := <-q.qchan:
- {
- ctx.InfoF("signal '%s' caught. will shutdown program.", sig.String())
- if q.cncl != nil {
- q.cncl()
- }
- if q.SignalNotifyFunc != nil {
- q.SignalNotifyFunc(sig)
- }
- return nil
- }
- }
- }
- func (q *WatchSignalExitSubService) Stop(ctx *core.SubServiceContext) {
- if q.cncl != nil {
- q.cncl()
- }
- }
|