67 lines
1.3 KiB
Go
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()
|
|
}
|