回调管理器实现
在特定条件下,需要触发一些钩子或回调;在没有统一编排引擎前,实现了简单的回调管理器,
价值:灵活的事件或条件下callback的统一注册和触发,非常容易集成在interface中,实现抽象、复用
import (
"sync"
"github.com/gin-gonic/gin"
"gitlab-ecs.litatom.com/infra/uiam/initialize"
)
type CallbackFunc func(c *gin.Context) error
type CallbackManager struct {
mu sync.RWMutex
callbacks map[string][]CallbackFunc
}
func NewCallbackManager() *CallbackManager {
return &CallbackManager{
callbacks: make(map[string][]CallbackFunc),
}
}
func (m *CallbackManager) RegisterCallback(event string, callback CallbackFunc) {
m.mu.Lock()
defer m.mu.Unlock()
m.callbacks[event] = append(m.callbacks[event], callback)
}
func (m *CallbackManager) TriggerCallbacks(event string, c *gin.Context) error {
m.mu.RLock()
defer m.mu.RUnlock()
if cbs, ok := m.callbacks[event]; ok {
for _, cb := range cbs {
if err := cb(c); err != nil {
initialize.ErrorLogger.Sugar().Errorf("%v TriggerCallbacks error: %v", event, err)
return err
}
initialize.AccessLogger.Sugar().Infof("%v TriggerCallbacks ok", event)
}
}
return nil
}
注册回调和触发回调
interface引入
type APPService struct {
APP app.IAPPDAO
CallbackManager *callback.CallbackManager
}
func NewAPPService() IAPIServicer {
appDAO := app.NewAPPDAO()
appService := APPService{APP: appDAO,
CallbackManager: callback.NewCallbackManager()}
return appService
}
在New对象时,初始化回调管理器
注册回调接口时机;
可以在构建工厂时直接注册,也可以在逻辑中符合条件时,注册;很灵活
构建回调
注册回调
if req.APIGetURL != "" {
var cb func(c *gin.Context) error = func(c *gin.Context) error {
as.registerAPIsOnCrateAppCallback(task.APICallParams{
URL: req.APIGetURL,
Method: "GET",
}, &ctxUser.Username, appId)
return nil
}
as.CallbackManager.RegisterCallback(RegisterAPIsOnCrateAppCallbackConfKey, cb)
}
触发回调
在合适的地方,触发回调
as.CallbackManager.TriggerCallbacks(RegisterAPIsOnCrateAppCallbackConfKey, c)