Fix tg bot graceful shutdown
This commit is contained in:
29
main.go
29
main.go
@@ -30,6 +30,13 @@ import (
|
||||
sloggin "github.com/samber/slog-gin"
|
||||
)
|
||||
|
||||
const (
|
||||
TelegramUpdateTimeout = 10
|
||||
ServerShutdownTimeout = 5
|
||||
|
||||
ForceShutdownTimeout = 20
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Создаем структурированный логгер
|
||||
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
|
||||
@@ -101,8 +108,13 @@ func main() {
|
||||
// Создаем WaitGroup для ожидания завершения всех воркеров
|
||||
var wg sync.WaitGroup
|
||||
|
||||
tgConfig := tgcontroller.TelegramConfig{
|
||||
BotToken: os.Getenv("TELEGRAM_BOT_TOKEN"),
|
||||
UpdateTimeout: TelegramUpdateTimeout,
|
||||
}
|
||||
|
||||
// Создаем Telegram бот
|
||||
tgController, err := tgcontroller.NewTelegramController(transcribeService, jobRepo, logger)
|
||||
tgController, err := tgcontroller.NewTelegramController(tgConfig, transcribeService, jobRepo, logger)
|
||||
if err != nil {
|
||||
logger.Error("Failed to create Telegram controller", "error", err)
|
||||
// Не останавливаем приложение, если Telegram бот не создан
|
||||
@@ -113,10 +125,8 @@ func main() {
|
||||
defer wg.Done()
|
||||
logger.Info("Starting Telegram bot")
|
||||
tgController.Start()
|
||||
logger.Info("Telegram bot stopped")
|
||||
}()
|
||||
|
||||
// Добавляем функцию остановки бота в контекст завершения
|
||||
defer tgController.Stop()
|
||||
}
|
||||
|
||||
// Создаем воркеры
|
||||
@@ -198,8 +208,13 @@ func main() {
|
||||
<-sigChan
|
||||
logger.Info("Received shutdown signal, initiating graceful shutdown...")
|
||||
|
||||
if tgController != nil {
|
||||
logger.Info("Shutting down Telegram bot...")
|
||||
tgController.Stop()
|
||||
}
|
||||
|
||||
// Создаем контекст с таймаутом для graceful shutdown HTTP сервера
|
||||
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), ServerShutdownTimeout*time.Second)
|
||||
defer shutdownCancel()
|
||||
|
||||
// Останавливаем HTTP сервер
|
||||
@@ -220,11 +235,11 @@ func main() {
|
||||
close(done)
|
||||
}()
|
||||
|
||||
// Ждем завершения всех воркеров или таймаута в 10 секунд
|
||||
// Ждем завершения всех воркеров или таймаута
|
||||
select {
|
||||
case <-done:
|
||||
logger.Info("All workers stopped gracefully")
|
||||
case <-time.After(10 * time.Second):
|
||||
case <-time.After(ForceShutdownTimeout * time.Second):
|
||||
logger.Warn("Timeout reached, forcing shutdown")
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user