1 Star 0 Fork 0

CaptialSTeam/ubdframe

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
app_mgr.go 2.93 KB
一键复制 编辑 原始数据 按行查看 历史
Souki 提交于 2025-12-08 17:01 +08:00 . !7modify support
//示例-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)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/captials-team/ubdframe.git
git@gitee.com:captials-team/ubdframe.git
captials-team
ubdframe
ubdframe
v1.0.4

搜索帮助