|
|
|
@ -30,47 +30,48 @@ func Run(parent context.Context, app App) {
|
|
|
|
|
ctx, canceller := context.WithCancel(parent)
|
|
|
|
|
defer canceller()
|
|
|
|
|
|
|
|
|
|
sig := make(chan os.Signal, 5)
|
|
|
|
|
signal.Notify(sig, syscall.SIGTERM, syscall.SIGHUP)
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
defer canceller()
|
|
|
|
|
InfoLog.Println("Starting service 🚀")
|
|
|
|
|
|
|
|
|
|
select {
|
|
|
|
|
case signal := <-sig:
|
|
|
|
|
TraceLog.Printf("[SHUTDOWN TRIGGERED] got shutdown signal: %v", signal)
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
TraceLog.Println("[SHUTDOWN TRIGGERED] context exited unexpectedly")
|
|
|
|
|
if err := loadConfig(app); err != nil {
|
|
|
|
|
ErrorLog.Println(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InfoLog.Println("Shutting down service ⛔⚠️😱")
|
|
|
|
|
stopCtx, stopCanceller := context.WithTimeout(parent, time.Second*5)
|
|
|
|
|
defer stopCanceller()
|
|
|
|
|
if err := app.Start(ctx); err != nil {
|
|
|
|
|
ErrorLog.Println(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
app.OnStop(stopCtx)
|
|
|
|
|
sig := make(chan os.Signal, 1)
|
|
|
|
|
signal.Notify(sig, syscall.SIGTERM, syscall.SIGHUP)
|
|
|
|
|
|
|
|
|
|
errs := &errgroup.Group{}
|
|
|
|
|
select {
|
|
|
|
|
case signal := <-sig:
|
|
|
|
|
TraceLog.Printf("[SHUTDOWN TRIGGERED] got shutdown signal: %v", signal)
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
TraceLog.Println("[SHUTDOWN TRIGGERED] context exited")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
errs.Go(CloseGRPCConns)
|
|
|
|
|
errs.Go(StopHTTPServer)
|
|
|
|
|
errs.Go(StopGRPCServer)
|
|
|
|
|
InfoLog.Println("Shutting down service ⛔⚠️😱")
|
|
|
|
|
|
|
|
|
|
if err := errs.Wait(); err != nil {
|
|
|
|
|
ErrorLog.Printf("There was an error shutting down the application gracefully: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
errs := &errgroup.Group{}
|
|
|
|
|
|
|
|
|
|
InfoLog.Println("Starting service 🚀")
|
|
|
|
|
errs.Go(CloseGRPCConns)
|
|
|
|
|
errs.Go(StopHTTPServer)
|
|
|
|
|
errs.Go(StopGRPCServer)
|
|
|
|
|
|
|
|
|
|
if err := loadConfig(app); err != nil {
|
|
|
|
|
ErrorLog.Println(err)
|
|
|
|
|
return
|
|
|
|
|
if err := errs.Wait(); err != nil {
|
|
|
|
|
ErrorLog.Printf("There was an error shutting down the application gracefully: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := app.Start(ctx); err != nil {
|
|
|
|
|
ErrorLog.Println(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
stopCtx, stopCanceller := context.WithTimeout(parent, time.Second*5)
|
|
|
|
|
defer stopCanceller()
|
|
|
|
|
app.OnStop(stopCtx)
|
|
|
|
|
|
|
|
|
|
TraceLog.Println("Shutdown process fully completed")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func loadConfig(cfg interface{}) error {
|
|
|
|
|