- HeartbeatArgs + HeartbeatWorker (logs slog.Info on each tick) - OrphanCleanupArgs + OrphanCleanupWorker (S3 delete then DB delete loop) - NewOrphanCleanupWorker constructor with pool + FileStorer injection - SlogErrorHandler implementing river.ErrorHandler (HandleError + HandlePanic) - fileQuerier interface for test injection without real DB - Unit tests: 7 tests pass (pure mock-based, no DB required) - go build ./... exits 0
26 lines
566 B
Go
26 lines
566 B
Go
package jobs
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
|
|
"github.com/riverqueue/river"
|
|
)
|
|
|
|
// HeartbeatArgs carries no data — heartbeat is purely a proof-of-life tick.
|
|
type HeartbeatArgs struct{}
|
|
|
|
func (HeartbeatArgs) Kind() string { return "heartbeat" }
|
|
|
|
// HeartbeatWorker logs a heartbeat message on each execution.
|
|
type HeartbeatWorker struct {
|
|
river.WorkerDefaults[HeartbeatArgs]
|
|
}
|
|
|
|
func (w *HeartbeatWorker) Work(ctx context.Context, job *river.Job[HeartbeatArgs]) error {
|
|
slog.Info("worker heartbeat",
|
|
"job_id", job.ID,
|
|
"attempt", job.Attempt,
|
|
)
|
|
return nil
|
|
}
|