package delay import ( "context" "joybuywork/internal/app" "joybuywork/internal/consts" "joybuywork/internal/plugins/jsonm" "joybuywork/internal/plugins/printer" "joybuywork/internal/utils" "fmt" "time" "github.com/rs/xid" "gits.branchcn.com/backend/microcode/plugins/derivative/delay" ) type Do func(ctx *Ctx) error type Ctx struct { ctx context.Context name string message delay.Delivery do Do } func NewCtx(ctx context.Context, name string, message delay.Delivery, do Do) *Ctx { ctx = context.WithValue(context.Background(), consts.TraceIdKey, message.AppId) msgId := xid.New().String() if message.MsgId != "" { msgId = message.MsgId } ctx = context.WithValue(ctx, consts.CtxMsgId, msgId) return &Ctx{ ctx: ctx, name: name, message: message, do: do, } } func (s *Ctx) Done() (err error) { if s == nil { return } req := utils.Bs(s.message.Body) defer app.TryCatch(s.ctx, fmt.Sprintf("执行任务[%s]失败,数据: %s", s.name, req)) tn := time.Now() sl := printer.NewSlowLog(s.ctx, printer.SetSlow(printer.TenNormalSlow)) app.Collect(s.name) sl.Start(fmt.Sprintf("运行[%s], 执行间隔:%12v, 数据:%s", s.name, time.Since(s.message.PublishTime), req)) defer func() { sl.End(fmt.Sprintf("执行时长:%12v, 运行错误:%v", time.Since(tn), err), err, s.name, req, "") }() err = s.do(&Ctx{ ctx: s.ctx, message: s.message, }) return } func (s *Ctx) Parse(data any) error { return jsonm.Unmarshal(s.message.Body, data) } func (s *Ctx) Context() context.Context { return s.ctx }