From f9c0a309b9e788f71173e9f931ac49496cba79ff Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Sat, 21 May 2022 13:16:31 -0700 Subject: service: support init jobs --- service/app_runner.go | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/service/app_runner.go b/service/app_runner.go index 99ae263..e1eb98b 100644 --- a/service/app_runner.go +++ b/service/app_runner.go @@ -2,6 +2,7 @@ package service import ( "context" + "fmt" "os" "os/signal" "sync" @@ -10,12 +11,15 @@ import ( type AppRunnerLogger interface { Info(...interface{}) + Error(...interface{}) } +type SyncRunnerFunc func() error type RunnerFunc func(context.Context, *sync.WaitGroup) error type AppRunner struct { Logger AppRunnerLogger + initJobs []SyncRunnerFunc jobs []RunnerFunc backgroundJobs []RunnerFunc wg *sync.WaitGroup @@ -26,6 +30,7 @@ type AppRunner struct { func NewAppRunner(ctx context.Context, logger AppRunnerLogger) *AppRunner { r := &AppRunner{ + initJobs: []SyncRunnerFunc{}, jobs: []RunnerFunc{}, backgroundJobs: []RunnerFunc{}, wg: &sync.WaitGroup{}, @@ -42,6 +47,16 @@ func NewAppRunner(ctx context.Context, logger AppRunnerLogger) *AppRunner { return r } +func (r *AppRunner) AddInitJob(f SyncRunnerFunc) { + r.initJobs = append(r.initJobs, f) +} + +func (r *AppRunner) AddInitJobs(jobs []SyncRunnerFunc) { + for _, j := range jobs { + r.AddInitJob(j) + } +} + func (r *AppRunner) AddJob(f RunnerFunc) { r.jobs = append(r.jobs, f) } @@ -56,7 +71,7 @@ func (r *AppRunner) AddBackgroundJob(f RunnerFunc) { r.backgroundJobs = append(r.backgroundJobs, f) } -func (r *AppRunner) goRunPanic(f func(context.Context, *sync.WaitGroup) error) { +func (r *AppRunner) goRunPanic(f RunnerFunc) { errs := make(chan error) go func() { errs <- f(r.ctx, r.wg) }() select { @@ -67,6 +82,18 @@ func (r *AppRunner) goRunPanic(f func(context.Context, *sync.WaitGroup) error) { } func (r *AppRunner) RunForever(enableBg bool) { + // Init jobs must run before main jobs start, the should return on + // success but will panic on error + r.Logger.Info("Starting initialization jobs") + for _, f := range r.initJobs { + if err := f(); err != nil { + r.Logger.Error(fmt.Sprintf("Init job failed: %s", err)) + return + } + } + r.Logger.Info("Initialization jobs finished") + + r.Logger.Info("Starting main jobs") for _, f := range r.jobs { r.goRunPanic(f) } -- cgit v1.2.3