You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.5 KiB
Go

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
}