55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package worker
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
|
|
"github.com/go-redis/redis/v8"
|
|
"github.com/hibiken/asynq"
|
|
"github.com/zhang2092/mediahls/internal/db"
|
|
)
|
|
|
|
const (
|
|
QueueCritical = "critical"
|
|
QueueDefault = "default"
|
|
)
|
|
|
|
type TaskProcessor interface {
|
|
Start() error
|
|
ProcessTaskConvertHLS(ctx context.Context, task *asynq.Task) error
|
|
}
|
|
|
|
type RedisTaskProcessor struct {
|
|
server *asynq.Server
|
|
store db.Store
|
|
}
|
|
|
|
func NewRedisTaskProcessor(redisOpt asynq.RedisClientOpt, store db.Store) TaskProcessor {
|
|
logger := NewLogger()
|
|
redis.SetLogger(logger)
|
|
|
|
config := asynq.Config{
|
|
Concurrency: 2, // 最大并发数量
|
|
Queues: map[string]int{
|
|
QueueCritical: 10,
|
|
QueueDefault: 5,
|
|
},
|
|
ErrorHandler: asynq.ErrorHandlerFunc(func(ctx context.Context, task *asynq.Task, err error) {
|
|
log.Printf("type: %s\n", task.Type())
|
|
log.Printf("payload: %s\n", task.Payload())
|
|
log.Printf("process task failed\n")
|
|
}),
|
|
}
|
|
server := asynq.NewServer(redisOpt, config)
|
|
return &RedisTaskProcessor{
|
|
server: server,
|
|
store: store,
|
|
}
|
|
}
|
|
|
|
func (processor *RedisTaskProcessor) Start() error {
|
|
mux := asynq.NewServeMux()
|
|
mux.HandleFunc(TaskConvertHLS, processor.ProcessTaskConvertHLS)
|
|
return processor.server.Start(mux)
|
|
}
|