package tasks import ( "context" v1 "management/internal/erpserver/service/v1" "github.com/drhin/logger" "github.com/hibiken/asynq" "go.uber.org/zap" ) const ( QueueCritical = "critical" QueueDefault = "default" ) type TaskProcessor interface { Start() error Shutdown() ProcessTaskConsumeAuditLog(ctx context.Context, task *asynq.Task) error } type RedisTaskProcessor struct { log *logger.Logger server *asynq.Server auditService v1.AuditLogService } func NewRedisTaskProcessor(log *logger.Logger, opt *RedisClientConnector, auditService v1.AuditLogService) TaskProcessor { server := asynq.NewServer( opt, asynq.Config{ Queues: map[string]int{ QueueCritical: 10, QueueDefault: 5, }, ErrorHandler: asynq.ErrorHandlerFunc(func(ctx context.Context, task *asynq.Task, err error) { log.Error("process task failed", err, zap.String("type", task.Type()), zap.Binary("payload", task.Payload()), ) }), }, ) return &RedisTaskProcessor{ log: log, server: server, auditService: auditService, } } func (p *RedisTaskProcessor) Start() error { mux := asynq.NewServeMux() mux.HandleFunc(TaskConsumeAuditLog, p.ProcessTaskConsumeAuditLog) return p.server.Start(mux) } func (p *RedisTaskProcessor) Shutdown() { p.server.Shutdown() }