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>
public class SchedulerService
{
private sealed record RecurringJobDefinition(
string JobId,
Expression<Func<Task>> Job,
string Cron,
string Description);
private readonly ILogger<SchedulerService> _logger;
private readonly IBackgroundJobClient _jobClient;
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()
{
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");
}