@@ -18,11 +18,15 @@ import (
18
18
"context"
19
19
"fmt"
20
20
"net/http"
21
+ "os"
22
+ "os/signal"
23
+ "syscall"
21
24
"time"
22
25
23
26
"github.com/prometheus/client_golang/prometheus/promhttp"
24
27
"github.com/trim21/errgo"
25
28
"go.uber.org/fx"
29
+ "golang.org/x/sync/errgroup"
26
30
27
31
"github.com/bangumi/server/config"
28
32
"github.com/bangumi/server/dal"
@@ -82,23 +86,33 @@ func Main() error {
82
86
return errgo .Wrap (err , "fx" )
83
87
}
84
88
85
- var errChan = make (chan error , 1 )
86
-
87
89
// metrics http reporter
88
90
mux := http .NewServeMux ()
89
91
mux .Handle ("/metrics" , promhttp .Handler ())
90
92
srv := & http.Server {Addr : h .config .ListenAddr (), Handler : mux , ReadHeaderTimeout : time .Second }
91
- go func () { errChan <- errgo .Wrap (srv .ListenAndServe (), "http" ) }()
93
+
94
+ var wg errgroup.Group
95
+
92
96
defer srv .Shutdown (context .Background ()) //nolint:errcheck
97
+ wg .Go (func () error {
98
+ return errgo .Wrap (srv .ListenAndServe (), "http" )
99
+ })
93
100
94
- go func () { errChan <- errgo .Wrap (h .start (), "start" ) }()
95
101
defer h .Close ()
96
-
97
- select {
98
- case err := <- errChan :
99
- return err
100
- case <- sys .HandleSignal ():
101
- logger .Info ("receive signal, shutdown" )
102
- return nil
103
- }
102
+ wg .Go (func () error {
103
+ return errgo .Wrap (h .start (), "start" )
104
+ })
105
+
106
+ wg .Go (func () error {
107
+ sigChan := make (chan os.Signal , 1 )
108
+ signal .Notify (sigChan , os .Interrupt , syscall .SIGTERM )
109
+
110
+ select {
111
+ case <- sys .HandleSignal ():
112
+ logger .Info ("receive signal, shutdown" )
113
+ return fmt .Errorf ("receive signal" )
114
+ }
115
+ })
116
+
117
+ wg .Wait ()
104
118
}
0 commit comments