diff options
author | Mike Crute <mike@crute.us> | 2022-05-21 13:16:31 -0700 |
---|---|---|
committer | Mike Crute <mike@crute.us> | 2022-05-21 13:16:31 -0700 |
commit | f9c0a309b9e788f71173e9f931ac49496cba79ff (patch) | |
tree | 687b2ade8b5525dac6c714d97750cb748f0dfd71 | |
parent | 64ccfb88e31207c0ad2090496613939403f50a7d (diff) | |
download | golib-f9c0a309b9e788f71173e9f931ac49496cba79ff.tar.bz2 golib-f9c0a309b9e788f71173e9f931ac49496cba79ff.tar.xz golib-f9c0a309b9e788f71173e9f931ac49496cba79ff.zip |
service: support init jobsv0.3.1
-rw-r--r-- | service/app_runner.go | 29 |
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 | ||
3 | import ( | 3 | import ( |
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 | ||
11 | type AppRunnerLogger interface { | 12 | type AppRunnerLogger interface { |
12 | Info(...interface{}) | 13 | Info(...interface{}) |
14 | Error(...interface{}) | ||
13 | } | 15 | } |
14 | 16 | ||
17 | type SyncRunnerFunc func() error | ||
15 | type RunnerFunc func(context.Context, *sync.WaitGroup) error | 18 | type RunnerFunc func(context.Context, *sync.WaitGroup) error |
16 | 19 | ||
17 | type AppRunner struct { | 20 | type 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 | ||
27 | func NewAppRunner(ctx context.Context, logger AppRunnerLogger) *AppRunner { | 31 | func 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 | ||
50 | func (r *AppRunner) AddInitJob(f SyncRunnerFunc) { | ||
51 | r.initJobs = append(r.initJobs, f) | ||
52 | } | ||
53 | |||
54 | func (r *AppRunner) AddInitJobs(jobs []SyncRunnerFunc) { | ||
55 | for _, j := range jobs { | ||
56 | r.AddInitJob(j) | ||
57 | } | ||
58 | } | ||
59 | |||
45 | func (r *AppRunner) AddJob(f RunnerFunc) { | 60 | func (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 | ||
59 | func (r *AppRunner) goRunPanic(f func(context.Context, *sync.WaitGroup) error) { | 74 | func (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 | ||
69 | func (r *AppRunner) RunForever(enableBg bool) { | 84 | func (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 | } |