thread-master/old/backend/internal/worker/job/publish_queue_sweeper.go

57 lines
1.4 KiB
Go
Raw Normal View History

package job
import (
"context"
"log"
"time"
publishqueuedomain "haixun-backend/internal/model/publish_queue/domain/usecase"
)
type PublishQueueSweeper struct {
queue publishqueuedomain.UseCase
batchSize int
}
func NewPublishQueueSweeper(queue publishqueuedomain.UseCase, batchSize int) *PublishQueueSweeper {
if batchSize <= 0 {
batchSize = 20
}
return &PublishQueueSweeper{queue: queue, batchSize: batchSize}
}
func (s *PublishQueueSweeper) Start(ctx context.Context, interval time.Duration) {
if s == nil || s.queue == nil {
return
}
if interval <= 0 {
interval = time.Minute
}
log.Printf("publish queue sweeper started: interval=%s batch=%d", interval, s.batchSize)
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
log.Printf("publish queue sweeper stopped")
return
case <-ticker.C:
missed, err := s.queue.MarkMissed(ctx, int64(10*time.Minute), s.batchSize)
if err != nil {
log.Printf("publish queue missed sweep error: %v", err)
} else if missed > 0 {
log.Printf("publish queue marked %d missed item(s)", missed)
}
dispatched, err := s.queue.DispatchDue(ctx, s.batchSize)
if err != nil {
log.Printf("publish queue sweeper tick error: %v", err)
continue
}
if dispatched > 0 {
log.Printf("publish queue sweeper dispatched %d item(s)", dispatched)
}
}
}
}