refactor(dotnet): standardize scheduler job definitions
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 20s
Validators (Pushes and Pull Requests) / validate-core (push) Successful in 2m5s

This commit is contained in:
2026-07-13 00:04:39 +09:00
parent 3483f84044
commit 528a1b4425
@@ -16,6 +16,12 @@ namespace QuantEngine.Web.Services;
/// </summary> /// </summary>
public class SchedulerService public class SchedulerService
{ {
private sealed record RecurringJobDefinition(
string JobId,
Expression<Func<Task>> Job,
string Cron,
string Description);
private readonly ILogger<SchedulerService> _logger; private readonly ILogger<SchedulerService> _logger;
private readonly IBackgroundJobClient _jobClient; private readonly IBackgroundJobClient _jobClient;
private readonly IRecurringJobManager _recurringJobManager; private readonly IRecurringJobManager _recurringJobManager;
@@ -76,6 +82,14 @@ public class SchedulerService
} }
} }
private IReadOnlyList<RecurringJobDefinition> 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() private static string? FindGatherTradingDataJson()
{ {
var baseDir = AppContext.BaseDirectory; var baseDir = AppContext.BaseDirectory;
@@ -104,37 +118,16 @@ public class SchedulerService
{ {
_logger.LogInformation("Initializing Hangfire schedules..."); _logger.LogInformation("Initializing Hangfire schedules...");
// Daily data collection at 9:00 AM foreach (var job in BuildRecurringJobs())
_recurringJobManager.AddOrUpdate( {
"daily-collection", _recurringJobManager.AddOrUpdate(
() => RunDailyCollectionAsync(), job.JobId,
"0 9 * * *", // Every day at 9:00 AM job.Job,
new RecurringJobOptions { TimeZone = TimeZoneInfo.Local } job.Cron,
); new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }
);
// Hourly price update (during market hours 9 AM - 4 PM, every 2 hours) _logger.LogInformation("Registered recurring job {JobId}: {Description}", job.JobId, job.Description);
_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 }
);
_logger.LogInformation("Hangfire schedules initialized successfully"); _logger.LogInformation("Hangfire schedules initialized successfully");
} }