package main
import (
stdCtx "context"
"github.com/kataras/iris"
"github.com/kataras/iris/context"
"github.com/kataras/iris/middleware/logger"
"github.com/kataras/iris/middleware/recover"
"sync"
"time"
)
func main() {
app := iris.New()
app.Use(recover.New())
app.Use(logger.New())
// 优雅的关闭程序
serverWG := new(sync.WaitGroup)
defer serverWG.Wait()
iris.RegisterOnInterrupt(func() {
serverWG.Add(1)
defer serverWG.Done()
ctx, cancel := stdCtx.WithTimeout(stdCtx.Background(), 20 * time.Second)
defer cancel()
// 关闭所有主机
app.Shutdown(ctx)
})
app.Get("/", func(ctx context.Context) {
ctx.JSON(iris.Map{"code": 1000, "data": "Welcome"})
})
app.Get("/hello", func(ctx context.Context) {
ctx.JSON(iris.Map{"code": 1000, "data": "Hello Iris"})
})
app.Run(iris.Addr(":8080"), iris.WithoutInterruptHandler)
}
说明:主要是借助了sync.WaitGroup的功能,来阻塞程序,防止app退出以后,ctx直接被销毁。一旦ctx被销毁,容易导致正在执行的任务没有执行完成。