using BotSharp.Abstraction.Infrastructures.Events; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace BotSharp.Core.Crontab.Services; public class CrontabEventSubscription : BackgroundService { private readonly ILogger _logger; private readonly IServiceProvider _services; public CrontabEventSubscription(IServiceProvider services, ILogger logger) { _logger = logger; _services = services; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Crontab event subscription background service is running."); using (var scope = _services.CreateScope()) { var publisher = scope.ServiceProvider.GetService(); if (publisher == null) { return; } var subscriber = scope.ServiceProvider.GetRequiredService(); var cron = scope.ServiceProvider.GetRequiredService(); var crons = await cron.GetCrontable(); foreach (var item in crons) { _ = Task.Run(async () => { // Clean unhandled messages await publisher.RemoveAsync($"Crontab:{item.Title}", count: 100); await subscriber.SubscribeAsync($"Crontab:{item.Title}", "Crontab", port: 0, priorityEnabled: false, async (sender, args) => { var scope = _services.CreateScope(); cron = scope.ServiceProvider.GetRequiredService(); await cron.ScheduledTimeArrived(item); }, stoppingToken: stoppingToken); }); } } } }