package base import "time" type ResJob struct { Uuid string `db:"uuid"` Code string `db:"code"` Name string `db:"name"` ResourceUuid string `db:"resource_uuid"` MaxAttempts int `db:"maxAttempts"` // 最大重试次数 Concurrent int `db:"concurrent"` // 同类 job 最大并发数,0 表示不限制 Timeout int `db:"timeout"` // 单次执行超时秒数,0 表示不限制 Retry int `db:"retry"` // 重试间隔秒数,0 表示不重试,>0 表示固定间隔秒数 UpdatedAt string `db:"updated_at"` CreatedAt string `db:"created_at"` } type GetResJob func(code string) (ResJob, bool) const ( FailedJobStatusResolved = 0 // 已解决(成功完成) FailedJobStatusPending = 1 // 待重试 FailedJobStatusExceeded = 2 // 已超出最大重试次数 FailedJobStatusInterrupted = 3 // shutdown 中断 ) type ResFailedJob struct { ID int64 `db:"id"` Queue string `db:"queue"` // 投递队列(ResJob.Code) Payload string `db:"payload"` // JSON Platform string `db:"platform"` Saas string `db:"saas"` TraceId string `db:"trace_id"` Exception string `db:"exception"` Attempts int `db:"attempts"` MaxAttempts int `db:"maxAttempts"` Status int `db:"status"` RetryAt *time.Time `db:"retry_at"` RetriedAt *time.Time `db:"retried_at"` OwnedUser string `db:"owned_user"` // 触发任务的用户 uuid CreatedAt string `db:"created_at"` UpdatedAt string `db:"updated_at"` } // CanRetry 是否还可以重试 func (j ResFailedJob) CanRetry() bool { return j.Status == FailedJobStatusPending && j.Attempts < j.MaxAttempts }