aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Crute <mike@crute.us>2022-05-21 13:16:31 -0700
committerMike Crute <mike@crute.us>2022-05-21 13:16:31 -0700
commitf9c0a309b9e788f71173e9f931ac49496cba79ff (patch)
tree687b2ade8b5525dac6c714d97750cb748f0dfd71
parent64ccfb88e31207c0ad2090496613939403f50a7d (diff)
downloadgolib-f9c0a309b9e788f71173e9f931ac49496cba79ff.tar.bz2
golib-f9c0a309b9e788f71173e9f931ac49496cba79ff.tar.xz
golib-f9c0a309b9e788f71173e9f931ac49496cba79ff.zip
service: support init jobsv0.3.1
-rw-r--r--service/app_runner.go29
1 files changed, 28 insertions, 1 deletions
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
2 2
3import ( 3import (
4 "context" 4 "context"
5 "fmt"
5 "os" 6 "os"
6 "os/signal" 7 "os/signal"
7 "sync" 8 "sync"
@@ -10,12 +11,15 @@ import (
10 11
11type AppRunnerLogger interface { 12type AppRunnerLogger interface {
12 Info(...interface{}) 13 Info(...interface{})
14 Error(...interface{})
13} 15}
14 16
17type SyncRunnerFunc func() error
15type RunnerFunc func(context.Context, *sync.WaitGroup) error 18type RunnerFunc func(context.Context, *sync.WaitGroup) error
16 19
17type AppRunner struct { 20type AppRunner struct {
18 Logger AppRunnerLogger 21 Logger AppRunnerLogger
22 initJobs []SyncRunnerFunc
19 jobs []RunnerFunc 23 jobs []RunnerFunc
20 backgroundJobs []RunnerFunc 24 backgroundJobs []RunnerFunc
21 wg *sync.WaitGroup 25 wg *sync.WaitGroup
@@ -26,6 +30,7 @@ type AppRunner struct {
26 30
27func NewAppRunner(ctx context.Context, logger AppRunnerLogger) *AppRunner { 31func NewAppRunner(ctx context.Context, logger AppRunnerLogger) *AppRunner {
28 r := &AppRunner{ 32 r := &AppRunner{
33 initJobs: []SyncRunnerFunc{},
29 jobs: []RunnerFunc{}, 34 jobs: []RunnerFunc{},
30 backgroundJobs: []RunnerFunc{}, 35 backgroundJobs: []RunnerFunc{},
31 wg: &sync.WaitGroup{}, 36 wg: &sync.WaitGroup{},
@@ -42,6 +47,16 @@ func NewAppRunner(ctx context.Context, logger AppRunnerLogger) *AppRunner {
42 return r 47 return r
43} 48}
44 49
50func (r *AppRunner) AddInitJob(f SyncRunnerFunc) {
51 r.initJobs = append(r.initJobs, f)
52}
53
54func (r *AppRunner) AddInitJobs(jobs []SyncRunnerFunc) {
55 for _, j := range jobs {
56 r.AddInitJob(j)
57 }
58}
59
45func (r *AppRunner) AddJob(f RunnerFunc) { 60func (r *AppRunner) AddJob(f RunnerFunc) {
46 r.jobs = append(r.jobs, f) 61 r.jobs = append(r.jobs, f)
47} 62}
@@ -56,7 +71,7 @@ func (r *AppRunner) AddBackgroundJob(f RunnerFunc) {
56 r.backgroundJobs = append(r.backgroundJobs, f) 71 r.backgroundJobs = append(r.backgroundJobs, f)
57} 72}
58 73
59func (r *AppRunner) goRunPanic(f func(context.Context, *sync.WaitGroup) error) { 74func (r *AppRunner) goRunPanic(f RunnerFunc) {
60 errs := make(chan error) 75 errs := make(chan error)
61 go func() { errs <- f(r.ctx, r.wg) }() 76 go func() { errs <- f(r.ctx, r.wg) }()
62 select { 77 select {
@@ -67,6 +82,18 @@ func (r *AppRunner) goRunPanic(f func(context.Context, *sync.WaitGroup) error) {
67} 82}
68 83
69func (r *AppRunner) RunForever(enableBg bool) { 84func (r *AppRunner) RunForever(enableBg bool) {
85 // Init jobs must run before main jobs start, the should return on
86 // success but will panic on error
87 r.Logger.Info("Starting initialization jobs")
88 for _, f := range r.initJobs {
89 if err := f(); err != nil {
90 r.Logger.Error(fmt.Sprintf("Init job failed: %s", err))
91 return
92 }
93 }
94 r.Logger.Info("Initialization jobs finished")
95
96 r.Logger.Info("Starting main jobs")
70 for _, f := range r.jobs { 97 for _, f := range r.jobs {
71 r.goRunPanic(f) 98 r.goRunPanic(f)
72 } 99 }