From 528a1b442560014ced18486e557ca7f209298925 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Mon, 13 Jul 2026 00:04:39 +0900 Subject: [PATCH] refactor(dotnet): standardize scheduler job definitions --- .../Services/SchedulerService.cs | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/dotnet/QuantEngine.Web/Services/SchedulerService.cs b/src/dotnet/QuantEngine.Web/Services/SchedulerService.cs index 7d0693e0..15d648ba 100644 --- a/src/dotnet/QuantEngine.Web/Services/SchedulerService.cs +++ b/src/dotnet/QuantEngine.Web/Services/SchedulerService.cs @@ -16,6 +16,12 @@ namespace QuantEngine.Web.Services; /// public class SchedulerService { + private sealed record RecurringJobDefinition( + string JobId, + Expression> Job, + string Cron, + string Description); + private readonly ILogger _logger; private readonly IBackgroundJobClient _jobClient; private readonly IRecurringJobManager _recurringJobManager; @@ -76,6 +82,14 @@ public class SchedulerService } } + private IReadOnlyList BuildRecurringJobs() => new[] + { + new RecurringJobDefinition("daily-collection", () => RunDailyCollectionAsync(), "0 9 * * *", "Daily data collection"), + new RecurringJobDefinition("hourly-price-update", () => UpdatePricesAsync(), "0 9,11,13,15 * * 1-5", "Hourly price update"), + new RecurringJobDefinition("weekly-report", () => GenerateWeeklyReportAsync(), "0 17 * * 5", "Weekly report generation"), + new RecurringJobDefinition("monthly-optimization", () => RunMonthlyOptimizationAsync(), "0 2 1 * *", "Monthly optimization"), + }; + private static string? FindGatherTradingDataJson() { var baseDir = AppContext.BaseDirectory; @@ -104,37 +118,16 @@ public class SchedulerService { _logger.LogInformation("Initializing Hangfire schedules..."); - // Daily data collection at 9:00 AM - _recurringJobManager.AddOrUpdate( - "daily-collection", - () => RunDailyCollectionAsync(), - "0 9 * * *", // Every day at 9:00 AM - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local } - ); - - // Hourly price update (during market hours 9 AM - 4 PM, every 2 hours) - _recurringJobManager.AddOrUpdate( - "hourly-price-update", - () => UpdatePricesAsync(), - "0 9,11,13,15 * * 1-5", // 9:00, 11:00, 13:00, 15:00 on Mon-Fri - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local } - ); - - // Weekly report generation (Friday at 5:00 PM) - _recurringJobManager.AddOrUpdate( - "weekly-report", - () => GenerateWeeklyReportAsync(), - "0 17 * * 5", // Every Friday at 5:00 PM - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local } - ); - - // Monthly optimization (First day of month at 2:00 AM) - _recurringJobManager.AddOrUpdate( - "monthly-optimization", - () => RunMonthlyOptimizationAsync(), - "0 2 1 * *", // First day of month at 2:00 AM - new RecurringJobOptions { TimeZone = TimeZoneInfo.Local } - ); + foreach (var job in BuildRecurringJobs()) + { + _recurringJobManager.AddOrUpdate( + job.JobId, + job.Job, + job.Cron, + new RecurringJobOptions { TimeZone = TimeZoneInfo.Local } + ); + _logger.LogInformation("Registered recurring job {JobId}: {Description}", job.JobId, job.Description); + } _logger.LogInformation("Hangfire schedules initialized successfully"); }