thread-master/internal/worker/job/reaper.go

45 lines
978 B
Go

package job
import (
"context"
"log"
"time"
domusecase "haixun-backend/internal/model/job/domain/usecase"
)
type Reaper struct {
jobs domusecase.UseCase
}
func NewReaper(jobs domusecase.UseCase) *Reaper {
return &Reaper{jobs: jobs}
}
func (r *Reaper) Start(ctx context.Context, interval time.Duration) {
if interval <= 0 {
interval = 30 * time.Second
}
log.Printf("job reaper started: interval=%s", interval)
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
log.Printf("job reaper stopped")
return
case <-ticker.C:
result, err := r.jobs.RunMaintenance(ctx)
if err != nil {
log.Printf("job reaper error: %v", err)
continue
}
if result.EnqueuedPending > 0 || result.ReapedCancelGrace > 0 || result.ReapedExpiredLocks > 0 {
log.Printf("job reaper: enqueued=%d cancel_grace=%d expired=%d",
result.EnqueuedPending, result.ReapedCancelGrace, result.ReapedExpiredLocks)
}
}
}
}