Files
hcs/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs

90 lines
3.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Hcs.WebApp.BackgroundServices.CampaignManagers;
using Hcs.WebApp.Services;
namespace Hcs.WebApp.BackgroundServices
{
public class CampaignManagementService(
CampaignManagementState campaignManagementState,
ManagerFactory managerFactory,
IServiceScopeFactory scopeFactory) : BackgroundService
{
private const int ITERATION_TIME = 1000;
private const int SLEEP_TIME = 30000;
private readonly CampaignManagementState campaignManagementState = campaignManagementState;
private readonly ManagerFactory managerFactory = managerFactory;
private readonly IServiceScopeFactory scopeFactory = scopeFactory;
private readonly List<IManager> managers = [];
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await InitializeStateAsync();
while (!stoppingToken.IsCancellationRequested)
{
while (campaignManagementState.TryDequeueCampaign(out var campaign))
{
if (stoppingToken.IsCancellationRequested) return;
using var scope = scopeFactory.CreateScope();
var manager = managerFactory.CreateManager(campaign);
if (manager != null)
{
try
{
await manager.StartAsync(scope);
managers.Add(manager);
}
catch (Exception e)
{
await manager.EndWithFailAsync(scope, e);
}
}
else
{
var headquartersService = scope.ServiceProvider.GetRequiredService<HeadquartersService>();
await headquartersService.SetCampaignEndedWithFailAsync(campaign.Id, "Не удалось найти подходящий менеджер кампании");
}
}
foreach (var manager in managers)
{
using var scope = scopeFactory.CreateScope();
try
{
await manager.CheckStateAsync(scope);
}
catch (Exception e)
{
await manager.EndWithFailAsync(scope, e);
}
}
managers.RemoveAll(x => x.State == IManager.ManagerState.Ended);
if (managers.Count > 0)
{
await Task.Delay(ITERATION_TIME, stoppingToken);
}
else
{
await Task.Delay(SLEEP_TIME, stoppingToken);
}
}
}
private async Task InitializeStateAsync()
{
using var scope = scopeFactory.CreateScope();
var headquartersService = scope.ServiceProvider.GetRequiredService<HeadquartersService>();
var campaigns = await headquartersService.GetNotEndedCampaignsAsync();
foreach (var campaign in campaigns)
{
campaignManagementState.EnqueueCampaign(campaign);
}
}
}
}