57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"io"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
"os/signal"
|
||
|
"syscall"
|
||
|
|
||
|
"github.com/neonxp/rutina"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
// New instance with builtin context. Alternative: r, ctx := rutina.WithContext(ctx)
|
||
|
r, _ := rutina.New()
|
||
|
|
||
|
srv := &http.Server{Addr: ":8080"}
|
||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||
|
io.WriteString(w, "hello world\n")
|
||
|
})
|
||
|
|
||
|
// Starting http server and listen connections
|
||
|
r.Go(func(ctx context.Context) error {
|
||
|
if err := srv.ListenAndServe(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
log.Println("Server stopped")
|
||
|
return nil
|
||
|
})
|
||
|
|
||
|
// Gracefully stoping server when context canceled
|
||
|
r.Go(func(ctx context.Context) error {
|
||
|
<-ctx.Done()
|
||
|
log.Println("Stopping server...")
|
||
|
return srv.Shutdown(ctx)
|
||
|
})
|
||
|
|
||
|
// OS signals subscriber
|
||
|
r.Go(func(ctx context.Context) error {
|
||
|
sig := make(chan os.Signal, 1)
|
||
|
signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
|
||
|
select {
|
||
|
case <-sig:
|
||
|
log.Println("TERM or INT signal received")
|
||
|
case <-ctx.Done():
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
|
||
|
if err := r.Wait(); err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
log.Println("All routines successfully stopped")
|
||
|
}
|