简单的回调管理器实现

21 阅读1分钟

回调管理器实现

  在特定条件下,需要触发一些钩子或回调;在没有统一编排引擎前,实现了简单的回调管理器,

  价值:灵活的事件或条件下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)