代码拉取完成,页面将自动刷新
//示例-App管理器
/*
app管理器可以添加app(符合app接口)来进行统一启动统一停止,支持优雅重启功能
创建一个app管理器: apps.NewAppManager()
添加对应app进行管理: mgr.WithApp(app1)
app需符合 interfaces.ItfApp 接口
*/
package app_help
import (
"context"
"gitee.com/captials-team/ubdframe/src/common"
"gitee.com/captials-team/ubdframe/src/domain/interfaces"
"gitee.com/captials-team/ubdframe/src/pkg/comag"
v1log "gitee.com/captials-team/ubdframe/src/pkg/logs"
"go.uber.org/dig"
"os"
"os/signal"
"syscall"
)
type AppManager struct {
di *dig.Container
apps []interfaces.ItfApp
logger v1log.ILog
process *comag.ConProcessModelActuator
}
// WithApp 添加需管理的app
func (mgr *AppManager) WithApp(app interfaces.ItfApp) {
mgr.apps = append(mgr.apps, app)
}
// Start 启动,启动所有管理app,会阻塞直到有退出问题
func (mgr *AppManager) Start() error {
v1log.Out.Info("AppManager ready apps num %d", len(mgr.apps))
//准备启动事宜
for _, v := range mgr.apps {
var ap = v
mgr.process.Add(func(ctx context.Context) {
defer mgr.logger.Info("App[%s] STOP SUCCESS", ap.Name())
//异步启动
go func() {
mgr.logger.Info("App[%s] START...", ap.Name())
//对app初始化处理
if s, ok := ap.(interfaces.ItfAppInitialize); ok && s != nil {
v1log.Out.Info("App[%s] Initialize", ap.Name())
s.Initialize()
}
if err := ap.Start(); err != nil {
//一个失败停止全部
mgr.logger.Warn("App[%s] START FAIL..%s", ap.Name(), err)
mgr.process.Stop()
return
}
}()
//之后监听停止context
for {
select {
case <-ctx.Done():
mgr.logger.Warn("App[%s] STOPPING...", ap.Name())
common.ErrPanic(ap.Stop())
return
}
}
})
}
//启动
if err := mgr.process.Start(); err != nil {
return err
}
return mgr.process.Wait()
}
func (mgr *AppManager) Stop() error {
defer mgr.logger.Warn("EXIT DONE")
if err := mgr.process.Stop(); err != nil {
return err
}
return mgr.process.Wait()
}
// WithSignalExit 收到系统信号后退出所有app(优雅退出)
func (mgr *AppManager) WithSignalExit(signs ...os.Signal) {
sigCh := make(chan os.Signal)
if len(signs) == 0 {
signs = append(signs,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
syscall.SIGHUP,
syscall.SIGABRT,
)
}
signal.Notify(sigCh, signs...)
go func() {
for {
select {
case sig := <-sigCh:
mgr.logger.Warn("RECEIVE SIGNAL EXIT %s", sig.String())
common.ErrPanic(mgr.Stop())
return
}
}
}()
}
// NewAppManager 创建app管理器
func NewAppManager(logger v1log.ILog) *AppManager {
return &AppManager{
di: dig.New(),
logger: logger,
process: comag.NewConProcessModelActuator(),
}
}
// DebugConsoleLog 提供一个基于控制台输出的debug级别的日志记录器
func DebugConsoleLog() v1log.ILog {
return v1log.NewWriterLog(os.Stdout, v1log.DebugLog)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。