Files
monorepo/LCU.API.Internal.Dispatcher/LCU.Api.Internal.Dispatcher/Services/DispatcherOperationServices/JobFailureService.cs
T
2026-04-22 15:01:09 +00:00

92 lines
4.5 KiB
C#

using LCU.Api.Internal.Dispatcher.Services.QueueServices;
using LCU.Api.Internal.MaidBotLib.Models;
using LCU.Library.Internal.DispatcherModels.Entities;
using LCU.Library.Internal.DispatcherModels.Enums;
using LCU.Library.Internal.DispatcherModels.Models;
using LCU.Library.Internal.DispatcherModels.Models.Requests;
using LCU.Library.Internal.DocumentIngestorModels.Models.IndexFileDocuments;
using LCU.Library.Internal.Exceptions;
using System;
using System.Collections.Generic;
namespace LCU.Api.Internal.Dispatcher.Services.DispatcherOperationServices
{
public class JobFailureService : IJobFailureService
{
private readonly IWorkItemService _workItemService;
private readonly IWorkItemExecutionService _workItemExecutionService;
private readonly IJobService _jobService;
private readonly IExecutionMessageService _executionMessageService;
private readonly IQueueDetermineOperationService _queueDetermineOperationService;
private readonly IQueueSendErroredJobAlertService _queueSendErroredJobAlertService;
public JobFailureService(IWorkItemService workItemService,
IWorkItemExecutionService workItemExecutionService,
IJobService jobService,
IExecutionMessageService executionMessageService,
IQueueDetermineOperationService queueDetermineOperationService,
IQueueSendErroredJobAlertService queueSendErroredJobAlertService)
{
_workItemService = workItemService;
_workItemExecutionService = workItemExecutionService;
_jobService = jobService;
_executionMessageService = executionMessageService;
_queueDetermineOperationService = queueDetermineOperationService;
_queueSendErroredJobAlertService = queueSendErroredJobAlertService;
}
public async Task HandleJobFailureRequest(JobFailureRequest jobFailureRequest)
{
try
{
var workItem = await _workItemService.GetByIdAsync(jobFailureRequest.WorkItemId);
var updatedWorkItemExecution = await _workItemExecutionService.UpdateFailedWorkItemExecution(workItem.CurrentWorkItemExecution);
if (workItem.CancelJobOnFailure)
{
workItem = await _workItemService.IncreaseCanceledJobCounter(workItem);
}
var job = await _jobService.GetByWorkItemIdExcludingWorkItemsIncludeErrorRecipientsAsync(jobFailureRequest.WorkItemId);
if (workItem.RequiresJobCancellation)
{
var message = $"This Job will be canceled and if scheduleable, rescheduled. The " +
$"WorkItem's canceled Job counter is currently at {workItem.CanceledJobCounter} and has " +
$"not yet went over the cancel Job limit of {workItem.CancelJobLimit}.";
jobFailureRequest.ExecutionMessages.Add(message);
job.JobStatus = JobStatus.DeterminingOperation;
}
else
{
job.JobStatus = JobStatus.Failed;
}
await _executionMessageService.SaveExecutionMessages(workItem.CurrentWorkItemExecution.WorkItemExecutionId, jobFailureRequest.ExecutionMessages);
var updatedJob = await _jobService.UpdateAsync(job);
if (updatedJob.JobStatus == JobStatus.DeterminingOperation)
{
await _queueDetermineOperationService.QueueDetermineOperation(updatedJob, workItem, DetermineOperationType.Failed);
}
else
{
await _queueSendErroredJobAlertService.QueueSendErroredJobAlert(job, workItem);
}
}
catch (ServiceException serviceException)
{
Log.Error(serviceException, $"Dispatcher Job Failure Request Failure. " +
$"The Dispatcher Job Failure Request is placed on LCU.Dispatcher.JobFailure_error.");
throw new ServiceException($"Failed to handle JobFailureRequest.");
}
catch(Exception exception)
{
Log.Error(exception, $"Failed to handle JobFailureRequest.");
throw new ServiceException($"Failed to handle JobFailureRequest.");
}
}
}
}