@@ -2,6 +2,7 @@ package main
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "net/http"
78 "os"
@@ -14,21 +15,15 @@ import (
1415 adapter "github.com/alebabai/go-kafka/adapter/sarama"
1516 "github.com/go-kit/log"
1617 "github.com/go-kit/log/level"
18+ "golang.org/x/sync/errgroup"
1719
1820 "github.com/alebabai/go-kit-kafka/v2/examples/common"
1921 "github.com/alebabai/go-kit-kafka/v2/examples/common/consumer"
2022)
2123
2224func main () {
23- var (
24- ctx context.Context
25- cancel context.CancelFunc
26- )
27- {
28- ctx = context .Background ()
29- ctx , cancel = context .WithCancel (ctx )
30- defer cancel ()
31- }
25+ ctx , stop := signal .NotifyContext (context .Background (), syscall .SIGINT , syscall .SIGTERM )
26+ defer stop ()
3227
3328 var logger log.Logger
3429 {
@@ -101,55 +96,51 @@ func main() {
10196
10297 _ = logger .Log ("msg" , "initializing http server" )
10398
104- var httpServer * http.Server
105- {
106- httpServer = & http.Server {
107- Addr : consumer .HTTPServerAddr ,
108- Handler : consumer .NewHTTPHandler (consumer .MakeListEventsEndpoint (svc )),
109- }
110-
111- defer func () {
112- if err := httpServer .Shutdown (ctx ); err != nil {
113- fatal (logger , fmt .Errorf ("failed to shutdown http server: %w" , err ))
114- }
115- }()
99+ httpServer := & http.Server {
100+ Addr : consumer .HTTPServerAddr ,
101+ Handler : consumer .NewHTTPHandler (consumer .MakeListEventsEndpoint (svc )),
116102 }
117103
118- errc := make ( chan error , 1 )
104+ g , ctx := errgroup . WithContext ( ctx )
119105
120- go func () {
106+ g . Go ( func () error {
121107 if err := consumerGroupListener .Listen (ctx , common .KafkaTopic ); err != nil {
122- errc <- err
108+ return fmt . Errorf ( "kafka listener: %w" , err )
123109 }
124- }()
110+ return nil
111+ })
125112
126- go func () {
113+ g . Go ( func () error {
127114 for err := range consumerGroupListener .Errors () {
128- time .Sleep (2 * time .Second ) // debounce
129115 level .Error (logger ).Log ("err" , err )
130116 }
131- }()
117+ return nil
118+ })
132119
133- go func () {
134- if err := httpServer .ListenAndServe (); err != nil {
135- errc <- err
120+ g . Go ( func () error {
121+ if err := httpServer .ListenAndServe (); err != nil && ! errors . Is ( err , http . ErrServerClosed ) {
122+ return fmt . Errorf ( "http server: %w" , err )
136123 }
137- }()
138-
139- sigc := make (chan os.Signal , 1 )
124+ return nil
125+ })
140126
141- go func () {
142- signal .Notify (sigc , syscall .SIGINT , syscall .SIGTERM )
143- }()
127+ g .Go (func () error {
128+ <- ctx .Done ()
129+ shutdownCtx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
130+ defer cancel ()
131+ if err := httpServer .Shutdown (shutdownCtx ); err != nil {
132+ return fmt .Errorf ("http server shutdown: %w" , err )
133+ }
134+ return nil
135+ })
144136
145137 _ = logger .Log ("msg" , "application started" )
146138
147- select {
148- case sig := <- sigc :
149- _ = logger .Log ("msg" , "application stopped" , "exit" , sig )
150- case err := <- errc :
139+ if err := g .Wait (); err != nil {
151140 fatal (logger , err )
152141 }
142+
143+ _ = logger .Log ("msg" , "application stopped" )
153144}
154145
155146func fatal (logger log.Logger , err error ) {
0 commit comments