fiber icon indicating copy to clipboard operation
fiber copied to clipboard

🤗 [Question]: FX with Fiber graceful shutdown Failed to stop cleanly: context deadline exceeded

Open conioX opened this issue 2 weeks ago • 7 comments

Question Description

Hello Guys

i always getting Failed to stop (cleanly: context deadline exceeded) after run the script and hit the endpoint /

[Fx] ERROR Failed to stop cleanly: context deadline exceeded

i also try ShutdownWithTimeout and ShutdownWithTimeout no one working

package main

import (
	"fx-fiber/webserver"
	"context"
	"go.uber.org/fx"
	"log"
	"time"
)

func boostrap(
	lifeCycle fx.Lifecycle,
	webserver *webserver.Webserver,
) {
	lifeCycle.Append(fx.Hook{
		OnStart: func(_ context.Context) error {
			go func() {
				if err := webserver.StartServer(); err != nil {
					log.Fatalf("start server error : %v\n", err)
				}
			}()
			return nil
		},
		OnStop: func(ctx context.Context) error {
			log.Println("stopping server ...")
			time.Sleep(5 * time.Second)
			log.Println("stop server success")
			return webserver.ShutDownServer()
		},
	})
}

func main() {
	fx.New(
                user.module,
		webserver.Module,
		fx.Invoke(boostrap),
	).Run()
}
package webserver

import (
	"github.com/gofiber/fiber/v2"
)

type (
	Webserver struct {
		app *fiber.App
	}
	webserverInterface interface {
		StartServer() error
		ShutDownServer() error
	}
)

func NewWebServer() *Webserver {
	return &Webserver{app: fiber.New()}
}

func (webServer *Webserver) App() *fiber.App {
	return webServer.app
}

func (webServer *Webserver) StartServer() error {
	app := webServer.app

	return app.Listen(":3000")
}

func (webServer *Webserver) EchoRoute(ctx *fiber.Ctx) error {
	return ctx.SendString("Hello, World 👋!")
}

func (webServer *Webserver) ShutDownServer() error {
	return webServer.app.Shutdown()
}

package webserver

import "go.uber.org/fx"

var Module = fx.Options(
	fx.Provide(NewWebServer),
)

package users

import (
       "fx-fiber/webserver"
	"github.com/gofiber/fiber/v2"
	"go.uber.org/fx"
)

type UserController struct {
	fx.In
}

func (c *UserController) GetPosts(ctx *fiber.Ctx) error {
	return ctx.SendString("Hello, World 👋!")
}

func UseRegister(webserver *webserver.Webserver, endpoint UserController) {
	webserver.App().Get("/", endpoint.GetPosts)
}
package users

import (
	"go.uber.org/fx"
)

var Module = fx.Options(
	fx.Invoke(UseRegister),
)

Code Snippet (optional)

No response

Checklist:

  • [X] I agree to follow Fiber's Code of Conduct.
  • [X] I have checked for existing issues that describe my questions prior to opening this one.
  • [X] I understand that improperly formatted questions may be closed without explanation.

conioX avatar Jun 30 '24 12:06 conioX