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

94 lines
3.5 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,
OperationExecutionState operationExecutionState,
ResultWaitState resultWaitState,
ManagerFactory managerFactory,
IServiceScopeFactory scopeFactory) : BackgroundService
{
private const int STATES_WAIT_TIME = 1000;
private const int ITERATION_TIME = 1000;
private const int SLEEP_TIME = 30000;
private readonly CampaignManagementState campaignManagementState = campaignManagementState;
private readonly OperationExecutionState operationExecutionState = operationExecutionState;
private readonly ResultWaitState resultWaitState = resultWaitState;
private readonly ManagerFactory managerFactory = managerFactory;
private readonly IServiceScopeFactory scopeFactory = scopeFactory;
private readonly List<IManager> managers = [];
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await WaitForOtherStates();
await InitializeStateAsync();
while (!stoppingToken.IsCancellationRequested)
{
while (campaignManagementState.TryDequeueCampaign(out var campaign))
{
if (stoppingToken.IsCancellationRequested) return;
var manager = managerFactory.CreateManager(campaign);
if (manager != null)
{
managers.Add(manager);
}
else
{
using var scope = scopeFactory.CreateScope();
var headquartersService = scope.ServiceProvider.GetRequiredService<HeadquartersService>();
await headquartersService.SetCampaignEndedWithFailAsync(campaign.Id, "Не удалось найти подходящий менеджер кампании");
}
}
foreach (var manager in managers)
{
try
{
await manager.ProcessAsync();
}
catch (Exception e)
{
await manager.EndWithFailAsync(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 WaitForOtherStates()
{
while (!operationExecutionState.Ready || !resultWaitState.Ready)
{
await Task.Delay(STATES_WAIT_TIME);
}
}
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);
}
}
}
}