projectx/internal/tasks/processor.go
2025-10-27 15:24:08 +08:00

67 lines
1.3 KiB
Go

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()
}