1. 被动调用
顾名思义,等待其他模块调用,比如作为一个接口被其他http 服务调用
2. 主动执行|调用
1. 有个cronjob 定期触发
2. 服务刚启动的时候,有个异步协程调用,这个有时候很容器忽略
3. 实例
cronjob + go 协程, 主动调用 查询db/事务钩子自动触发,发送消息到event_bus 的topic
func NewOutboxManager(
eventUsecase *event.EventUsecase, eventBus event.EventBus, waitingQueue *event.OutboxMessageLocalPendingQueue,
logger log.Logger, conf *OutboxManagerConfig, txMgr tx.TransactionManager, cronUsecase *cron.CronJobUsecase,
) (*OutboxManager, error) {
if err := conf.Vaildate(); err != nil {
return nil, err
}
m := &OutboxManager{
conf: conf,
pendingQueue: waitingQueue,
eventUsecase: eventUsecase,
eventBus: eventBus,
cronUsecase: cronUsecase,
txMgr: txMgr,
log: log.NewHelper(log.With(logger, "module", "OutboxManager")),
}
if err := m.registerCronJobs(conf); err != nil {
return nil, err
}
// TODO: 优雅退出
go m.runLoop(context.Background())
return m, nil
}