mirror of
https://github.com/EZ-Api/ez-api.git
synced 2026-01-13 17:47:51 +00:00
refactor(cron): migrate cron jobs to foundation scheduler
Replace custom goroutine-based scheduling in cron jobs with centralized foundation scheduler. Each cron job now exposes a RunOnce method called by the scheduler instead of managing its own ticker loop. Changes: - Remove interval/enabled config from cron job structs - Convert Start() methods to RunOnce() for all cron jobs - Add scheduler setup in main.go with configurable intervals - Update foundation dependency to v0.6.0 for scheduler support - Update tests to validate RunOnce nil-safety
This commit is contained in:
@@ -23,6 +23,7 @@ import (
|
||||
"github.com/ez-api/ez-api/internal/model"
|
||||
"github.com/ez-api/ez-api/internal/service"
|
||||
"github.com/ez-api/foundation/logging"
|
||||
"github.com/ez-api/foundation/scheduler"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/redis/go-redis/v9"
|
||||
swaggerFiles "github.com/swaggo/files"
|
||||
@@ -186,33 +187,29 @@ func main() {
|
||||
logCtx, cancelLogs := context.WithCancel(context.Background())
|
||||
defer cancelLogs()
|
||||
logWriter.Start(logCtx)
|
||||
quotaResetter := cron.NewQuotaResetter(db, syncService, time.Duration(cfg.Quota.ResetIntervalSeconds)*time.Second)
|
||||
quotaCtx, cancelQuota := context.WithCancel(context.Background())
|
||||
defer cancelQuota()
|
||||
go quotaResetter.Start(quotaCtx)
|
||||
logCleaner := cron.NewLogCleaner(logDB, rdb, cfg.Log.RetentionDays, int64(cfg.Log.MaxRecords), time.Hour, logPartitioner)
|
||||
cleanerCtx, cancelCleaner := context.WithCancel(context.Background())
|
||||
defer cancelCleaner()
|
||||
go logCleaner.Start(cleanerCtx)
|
||||
|
||||
// Initialize cron jobs
|
||||
quotaResetter := cron.NewQuotaResetter(db, syncService)
|
||||
logCleaner := cron.NewLogCleaner(logDB, rdb, cfg.Log.RetentionDays, int64(cfg.Log.MaxRecords), logPartitioner)
|
||||
tokenRefresher := cron.NewTokenRefresher(
|
||||
db,
|
||||
rdb,
|
||||
syncService,
|
||||
time.Duration(cfg.TokenRefresh.IntervalSeconds)*time.Second,
|
||||
time.Duration(cfg.TokenRefresh.RefreshSkewSeconds)*time.Second,
|
||||
cfg.TokenRefresh.BatchSize,
|
||||
cfg.TokenRefresh.MaxRetries,
|
||||
)
|
||||
tokenCtx, cancelToken := context.WithCancel(context.Background())
|
||||
defer cancelToken()
|
||||
go tokenRefresher.Start(tokenCtx)
|
||||
|
||||
// Alert Detector
|
||||
alertDetectorConfig := cron.DefaultAlertDetectorConfig()
|
||||
alertDetector := cron.NewAlertDetector(db, logDB, rdb, service.NewStatsService(rdb), alertDetectorConfig, logger)
|
||||
alertDetectorCtx, cancelAlertDetector := context.WithCancel(context.Background())
|
||||
defer cancelAlertDetector()
|
||||
go alertDetector.Start(alertDetectorCtx)
|
||||
|
||||
// Setup scheduler
|
||||
sched := scheduler.New(scheduler.WithLogger(logger), scheduler.WithSkipIfRunning())
|
||||
sched.Every("quota-reset", time.Duration(cfg.Quota.ResetIntervalSeconds)*time.Second, quotaResetter.RunOnce)
|
||||
sched.Every("log-cleanup", time.Hour, logCleaner.RunOnce)
|
||||
sched.Every("token-refresh", time.Duration(cfg.TokenRefresh.IntervalSeconds)*time.Second, tokenRefresher.RunOnce)
|
||||
sched.Every("alert-detection", time.Minute, alertDetector.RunOnce)
|
||||
sched.Start()
|
||||
defer sched.Stop()
|
||||
|
||||
adminService, err := service.NewAdminService()
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user