style(shared-sqs): fix formatting in goaws.go (blank lines)
This commit is contained in:
+105
-105
@@ -4,127 +4,127 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"shared-sqs/app/conf"
|
"shared-sqs/app/conf"
|
||||||
"shared-sqs/app/gosqs"
|
"shared-sqs/app/gosqs"
|
||||||
"shared-sqs/app/models"
|
"shared-sqs/app/models"
|
||||||
"shared-sqs/app/router"
|
"shared-sqs/app/router"
|
||||||
"shared-sqs/app/tenant"
|
"shared-sqs/app/tenant"
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var configFile string
|
var configFile string
|
||||||
var adminToken string
|
var adminToken string
|
||||||
var port string
|
var port string
|
||||||
var debug bool
|
var debug bool
|
||||||
var loglevel string
|
var loglevel string
|
||||||
|
|
||||||
flag.StringVar(&configFile, "config", "", "config file location")
|
flag.StringVar(&configFile, "config", "", "config file location")
|
||||||
flag.StringVar(&adminToken, "admin-token", "", "admin API bearer token")
|
flag.StringVar(&adminToken, "admin-token", "", "admin API bearer token")
|
||||||
flag.StringVar(&port, "port", "4100", "listen port")
|
flag.StringVar(&port, "port", "4100", "listen port")
|
||||||
flag.BoolVar(&debug, "debug", false, "set debug log level")
|
flag.BoolVar(&debug, "debug", false, "set debug log level")
|
||||||
flag.StringVar(&loglevel, "loglevel", "info", "log level (info, debug, warn, error)")
|
flag.StringVar(&loglevel, "loglevel", "info", "log level (info, debug, warn, error)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
log.SetFormatter(&log.JSONFormatter{})
|
log.SetFormatter(&log.JSONFormatter{})
|
||||||
log.SetOutput(os.Stdout)
|
log.SetOutput(os.Stdout)
|
||||||
|
|
||||||
if debug {
|
if debug {
|
||||||
log.SetLevel(log.DebugLevel)
|
log.SetLevel(log.DebugLevel)
|
||||||
} else {
|
} else {
|
||||||
level, err := log.ParseLevel(loglevel)
|
level, err := log.ParseLevel(loglevel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.SetLevel(log.InfoLevel)
|
log.SetLevel(log.InfoLevel)
|
||||||
log.Warnf("Failed to parse loglevel %v, defaulting to info", loglevel)
|
log.Warnf("Failed to parse loglevel %v, defaulting to info", loglevel)
|
||||||
} else {
|
} else {
|
||||||
log.SetLevel(level)
|
log.SetLevel(level)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Admin token: flag > env SHARED_SQS_ADMIN_TOKEN > fatal (Trap #13)
|
// Admin token: flag > env SHARED_SQS_ADMIN_TOKEN > fatal (Trap #13)
|
||||||
if adminToken == "" {
|
if adminToken == "" {
|
||||||
adminToken = os.Getenv("SHARED_SQS_ADMIN_TOKEN")
|
adminToken = os.Getenv("SHARED_SQS_ADMIN_TOKEN")
|
||||||
}
|
}
|
||||||
if adminToken == "" {
|
if adminToken == "" {
|
||||||
log.Fatal("admin token required: use --admin-token flag or SHARED_SQS_ADMIN_TOKEN env var")
|
log.Fatal("admin token required: use --admin-token flag or SHARED_SQS_ADMIN_TOKEN env var")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Загрузить конфиг (очереди, env — без SNS)
|
// Загрузить конфиг (очереди, env — без SNS)
|
||||||
env := "Local"
|
env := "Local"
|
||||||
if flag.NArg() > 0 {
|
if flag.NArg() > 0 {
|
||||||
env = flag.Arg(0)
|
env = flag.Arg(0)
|
||||||
}
|
}
|
||||||
conf.LoadYamlConfig(configFile, env)
|
conf.LoadYamlConfig(configFile, env)
|
||||||
|
|
||||||
if models.CurrentEnvironment.LogToFile {
|
if models.CurrentEnvironment.LogToFile {
|
||||||
filename := models.CurrentEnvironment.LogFile
|
filename := models.CurrentEnvironment.LogFile
|
||||||
file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
log.SetOutput(file)
|
log.SetOutput(file)
|
||||||
} else {
|
} else {
|
||||||
log.Infof("Failed to log to file: %s, using default stdout", filename)
|
log.Infof("Failed to log to file: %s, using default stdout", filename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Инициализация in-memory TenantStore
|
// Инициализация in-memory TenantStore
|
||||||
tenantStore := tenant.NewTenantStore()
|
tenantStore := tenant.NewTenantStore()
|
||||||
// Автосид демо-данных при SHARED_SQS_SEED_DEMO=true
|
// Автосид демо-данных при SHARED_SQS_SEED_DEMO=true
|
||||||
if os.Getenv("SHARED_SQS_SEED_DEMO") == "true" {
|
if os.Getenv("SHARED_SQS_SEED_DEMO") == "true" {
|
||||||
seedDemoData(tenantStore)
|
seedDemoData(tenantStore)
|
||||||
}
|
}
|
||||||
// Роутер с tenant auth и admin API
|
// Роутер с tenant auth и admin API
|
||||||
r := router.New(tenantStore, adminToken)
|
r := router.New(tenantStore, adminToken)
|
||||||
|
|
||||||
// PeriodicTasks — visibility timeout, DLQ, deduplication
|
// PeriodicTasks — visibility timeout, DLQ, deduplication
|
||||||
quit := make(chan bool)
|
quit := make(chan bool)
|
||||||
go gosqs.PeriodicTasks(1*time.Second, quit)
|
go gosqs.PeriodicTasks(1*time.Second, quit)
|
||||||
|
|
||||||
// HTTP сервер с таймаутами
|
// HTTP сервер с таймаутами
|
||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
Addr: "0.0.0.0:" + port,
|
Addr: "0.0.0.0:" + port,
|
||||||
Handler: r,
|
Handler: r,
|
||||||
ReadTimeout: 30 * time.Second,
|
ReadTimeout: 30 * time.Second,
|
||||||
WriteTimeout: 35 * time.Second, // чуть больше чем max WaitTimeSeconds (20s)
|
WriteTimeout: 35 * time.Second, // чуть больше чем max WaitTimeSeconds (20s)
|
||||||
IdleTimeout: 60 * time.Second,
|
IdleTimeout: 60 * time.Second,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Запуск в горутине для graceful shutdown
|
// Запуск в горутине для graceful shutdown
|
||||||
serverErr := make(chan error, 1)
|
serverErr := make(chan error, 1)
|
||||||
go func() {
|
go func() {
|
||||||
log.Infof("shared-sqs listening on 0.0.0.0:%s", port)
|
log.Infof("shared-sqs listening on 0.0.0.0:%s", port)
|
||||||
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||||
serverErr <- err
|
serverErr <- err
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Graceful shutdown по SIGTERM/SIGINT (Trap #13)
|
// Graceful shutdown по SIGTERM/SIGINT (Trap #13)
|
||||||
sigCh := make(chan os.Signal, 1)
|
sigCh := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigCh, syscall.SIGTERM, syscall.SIGINT)
|
signal.Notify(sigCh, syscall.SIGTERM, syscall.SIGINT)
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case sig := <-sigCh:
|
case sig := <-sigCh:
|
||||||
log.Infof("Received signal %s, shutting down", sig)
|
log.Infof("Received signal %s, shutting down", sig)
|
||||||
case err := <-serverErr:
|
case err := <-serverErr:
|
||||||
log.Fatalf("Server error: %v", err)
|
log.Fatalf("Server error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Остановить PeriodicTasks
|
// Остановить PeriodicTasks
|
||||||
close(quit)
|
close(quit)
|
||||||
|
|
||||||
// Дать 10 секунд на завершение текущих HTTP запросов
|
// Дать 10 секунд на завершение текущих HTTP запросов
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
if err := srv.Shutdown(ctx); err != nil {
|
if err := srv.Shutdown(ctx); err != nil {
|
||||||
log.Errorf("Server shutdown error: %v", err)
|
log.Errorf("Server shutdown error: %v", err)
|
||||||
}
|
}
|
||||||
log.Info("shared-sqs stopped")
|
log.Info("shared-sqs stopped")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user