Naming fix

This commit is contained in:
Michał Zieliński
2025-06-08 10:56:20 +02:00
parent ff41a71484
commit 99d8593c49
14 changed files with 84 additions and 78 deletions

View File

@@ -15,17 +15,20 @@ namespace DiunaBI.Core.Services;
public class JobQueueProcessor : BackgroundService
{
private readonly IServiceProvider _serviceProvider;
private readonly IServiceScopeFactory _scopeFactory; // ✅ GOOD - używa scope factory
private readonly ILogger<JobQueueProcessor> _logger;
private readonly ManualResetEventSlim _processSignal;
private readonly ManualResetEventSlim _processSignal = new(false);
// ❌ USUŃ DIRECT INJECTION scoped services:
// private readonly IJobQueueService _queueService;
// private readonly AppDbContext _db;
public JobQueueProcessor(
IServiceProvider serviceProvider,
IServiceScopeFactory scopeFactory, // ✅ GOOD - inject scope factory
ILogger<JobQueueProcessor> logger)
{
_serviceProvider = serviceProvider;
_scopeFactory = scopeFactory;
_logger = logger;
_processSignal = new ManualResetEventSlim(false);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@@ -36,19 +39,18 @@ public class JobQueueProcessor : BackgroundService
{
try
{
// Wait for manual trigger or cancellation
// Wait for manual trigger
_processSignal.Wait(stoppingToken);
_processSignal.Reset();
_logger.LogInformation("JobQueueProcessor: Processing triggered manually");
_logger.LogInformation("JobQueueProcessor: Processing triggered");
using var scope = _serviceProvider.CreateScope();
// ✅ GOOD - create scope for each processing cycle
using var scope = _scopeFactory.CreateScope();
var queueService = scope.ServiceProvider.GetRequiredService<IJobQueueService>();
var pluginManager = scope.ServiceProvider.GetRequiredService<PluginManager>();
// Process all jobs until queue is empty
await ProcessAllJobs(queueService, stoppingToken);
_logger.LogInformation("JobQueueProcessor: Manual processing completed");
await ProcessQueueAsync(queueService, pluginManager, stoppingToken);
}
catch (OperationCanceledException)
{
@@ -57,8 +59,8 @@ public class JobQueueProcessor : BackgroundService
}
catch (Exception ex)
{
_logger.LogError(ex, "JobQueueProcessor: Unexpected error in queue processor");
await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
_logger.LogError(ex, "JobQueueProcessor: Error in processing loop");
await Task.Delay(5000, stoppingToken); // Wait before retry
}
}
@@ -71,7 +73,7 @@ public class JobQueueProcessor : BackgroundService
_processSignal.Set();
}
private async Task ProcessAllJobs(IJobQueueService queueService, CancellationToken cancellationToken)
private async Task ProcessQueueAsync(IJobQueueService queueService, PluginManager pluginManager, CancellationToken cancellationToken)
{
var startTime = DateTime.UtcNow;
var initialQueueSize = await queueService.GetQueueCountAsync();
@@ -131,7 +133,8 @@ public class JobQueueProcessor : BackgroundService
_logger.LogInformation("JobQueueProcessor: Processing {JobType} job {JobId} for layer {LayerName} (attempt {RetryCount}/{MaxRetries}, priority {Priority})",
job.JobType, job.Id, job.LayerName, job.RetryCount + 1, job.MaxRetries, job.Priority);
using var scope = _serviceProvider.CreateScope();
// POPRAWKA: używaj _scopeFactory zamiast _serviceProvider
using var scope = _scopeFactory.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var pluginManager = scope.ServiceProvider.GetRequiredService<PluginManager>();
var queueService = scope.ServiceProvider.GetRequiredService<IJobQueueService>();
@@ -199,7 +202,8 @@ public class JobQueueProcessor : BackgroundService
_logger.LogError(ex, "JobQueueProcessor: Error processing {JobType} job {JobId} for layer {LayerName}",
job.JobType, job.Id, job.LayerName);
using var scope = _serviceProvider.CreateScope();
// POPRAWKA: tutaj też używaj _scopeFactory
using var scope = _scopeFactory.CreateScope();
var queueService = scope.ServiceProvider.GetRequiredService<IJobQueueService>();
// Check if it's a retriable error

View File

@@ -10,13 +10,13 @@ using Microsoft.Extensions.Logging;
namespace DiunaBI.Plugins.Morska.Processors;
public class T1R1Processor : MorskaBaseProcessor
public class MorskaT1R1Processor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T1.R1";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
private readonly ILogger<T1R1Processor> _logger;
private readonly ILogger<MorskaT1R1Processor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
@@ -24,10 +24,10 @@ public class T1R1Processor : MorskaBaseProcessor
private List<Record>? DynamicCodes { get; set; }
private string? GoogleSheetName { get; set; }
public T1R1Processor(
public MorskaT1R1Processor(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues,
ILogger<T1R1Processor> logger)
ILogger<MorskaT1R1Processor> logger)
{
_db = db;
_googleSheetValues = googleSheetValues;

View File

@@ -10,22 +10,22 @@ using Microsoft.Extensions.Logging;
namespace DiunaBI.Plugins.Morska.Processors;
public class T1R3Processor : MorskaBaseProcessor
public class MorskaT1R3Processor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T1.R3";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
private readonly ILogger<T1R3Processor> _logger;
private readonly ILogger<MorskaT1R3Processor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
private string? Source { get; set; }
public T1R3Processor(
public MorskaT1R3Processor(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues,
ILogger<T1R3Processor> logger)
ILogger<MorskaT1R3Processor> logger)
{
_db = db;
_googleSheetValues = googleSheetValues;

View File

@@ -6,12 +6,12 @@ using Microsoft.Extensions.Logging;
namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceCopySelectedCodesProcessor : MorskaBaseProcessor
public class MorskaT3MultiSourceCopySelectedCodesProcessor : MorskaBaseProcessor
{
public override string ProcessorType => "T3.MultiSourceCopySelectedCodes";
private readonly AppDbContext _db;
private readonly ILogger<T3MultiSourceCopySelectedCodesProcessor> _logger;
private readonly ILogger<MorskaT3MultiSourceCopySelectedCodesProcessor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
@@ -20,9 +20,9 @@ public class T3MultiSourceCopySelectedCodesProcessor : MorskaBaseProcessor
private string? Codes { get; set; }
private List<int>? CodesList { get; set; }
public T3MultiSourceCopySelectedCodesProcessor(
public MorskaT3MultiSourceCopySelectedCodesProcessor(
AppDbContext db,
ILogger<T3MultiSourceCopySelectedCodesProcessor> logger)
ILogger<MorskaT3MultiSourceCopySelectedCodesProcessor> logger)
{
_db = db;
_logger = logger;

View File

@@ -6,19 +6,19 @@ using Microsoft.Extensions.Logging;
namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceCopySelectedCodesYearSummaryProcessor : MorskaBaseProcessor
public class MorskaT3MultiSourceCopySelectedCodesYearSummaryProcessor : MorskaBaseProcessor
{
public override string ProcessorType => "T3.MultiSourceCopySelectedCodesYearSummary";
private readonly AppDbContext _db;
private readonly ILogger<T3MultiSourceCopySelectedCodesYearSummaryProcessor> _logger;
private readonly ILogger<MorskaT3MultiSourceCopySelectedCodesYearSummaryProcessor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
public T3MultiSourceCopySelectedCodesYearSummaryProcessor(
public MorskaT3MultiSourceCopySelectedCodesYearSummaryProcessor(
AppDbContext db,
ILogger<T3MultiSourceCopySelectedCodesYearSummaryProcessor> logger)
ILogger<MorskaT3MultiSourceCopySelectedCodesYearSummaryProcessor> logger)
{
_db = db;
_logger = logger;

View File

@@ -7,12 +7,12 @@ using DiunaBI.Core.Services.Calculations;
namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceSummaryProcessor : MorskaBaseProcessor
public class MorskaT3MultiSourceSummaryProcessor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T3.MultiSourceSummary";
private readonly AppDbContext _db;
private readonly ILogger<T3MultiSourceSummaryProcessor> _logger;
private readonly ILogger<MorskaT3MultiSourceSummaryProcessor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
@@ -20,9 +20,9 @@ public class T3MultiSourceSummaryProcessor : MorskaBaseProcessor
private List<Record>? Sources { get; set; }
private List<Record>? DynamicCodes { get; set; }
public T3MultiSourceSummaryProcessor(
public MorskaT3MultiSourceSummaryProcessor(
AppDbContext db,
ILogger<T3MultiSourceSummaryProcessor> logger)
ILogger<MorskaT3MultiSourceSummaryProcessor> logger)
{
_db = db;
_logger = logger;

View File

@@ -7,21 +7,21 @@ using DiunaBI.Core.Services.Calculations;
namespace DiunaBI.Plugins.Morska.Processors;
public class T3MultiSourceYearSummaryProcessor : MorskaBaseProcessor
public class MorskaT3MultiSourceYearSummaryProcessor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T3.MultiSourceYearSummary";
private readonly AppDbContext _db;
private readonly ILogger<T3MultiSourceYearSummaryProcessor> _logger;
private readonly ILogger<MorskaT3MultiSourceYearSummaryProcessor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
private List<Record>? Sources { get; set; }
private List<Record>? DynamicCodes { get; set; }
public T3MultiSourceYearSummaryProcessor(
public MorskaT3MultiSourceYearSummaryProcessor(
AppDbContext db,
ILogger<T3MultiSourceYearSummaryProcessor> logger)
ILogger<MorskaT3MultiSourceYearSummaryProcessor> logger)
{
_db = db;
_logger = logger;

View File

@@ -7,22 +7,22 @@ using DiunaBI.Core.Services;
namespace DiunaBI.Plugins.Morska.Processors;
public class T3SourceYearSummaryProcessor : MorskaBaseProcessor
public class MorskaT3SourceYearSummaryProcessor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T3.SourceYearSummary";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
private readonly ILogger<T3SourceYearSummaryProcessor> _logger;
private readonly ILogger<MorskaT3SourceYearSummaryProcessor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
private string? Source { get; set; }
public T3SourceYearSummaryProcessor(
public MorskaT3SourceYearSummaryProcessor(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues,
ILogger<T3SourceYearSummaryProcessor> logger)
ILogger<MorskaT3SourceYearSummaryProcessor> logger)
{
_db = db;
_googleSheetValues = googleSheetValues;

View File

@@ -9,13 +9,13 @@ using DiunaBI.Core.Services;
namespace DiunaBI.Plugins.Morska.Processors;
public class T4R2Processor : MorskaBaseProcessor
public class MorskaT4R2Processor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T4.R2";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
private readonly ILogger<T4R2Processor> _logger;
private readonly ILogger<MorskaT4R2Processor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
@@ -24,10 +24,10 @@ public class T4R2Processor : MorskaBaseProcessor
private string? ReportSheetName { get; set; }
private string? InvoicesSheetName { get; set; }
public T4R2Processor(
public MorskaT4R2Processor(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues,
ILogger<T4R2Processor> logger)
ILogger<MorskaT4R2Processor> logger)
{
_db = db;
_googleSheetValues = googleSheetValues;

View File

@@ -6,13 +6,13 @@ using DiunaBI.Core.Database.Context;
namespace DiunaBI.Plugins.Morska.Processors;
public class T4SingleSourceProcessor : MorskaBaseProcessor
public class MorskaT4SingleSourceProcessor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T4.SingleSource";
private readonly AppDbContext _db;
private readonly SpreadsheetsResource.ValuesResource _googleSheetValues;
private readonly ILogger<T4SingleSourceProcessor> _logger;
private readonly ILogger<MorskaT4SingleSourceProcessor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
@@ -20,10 +20,10 @@ public class T4SingleSourceProcessor : MorskaBaseProcessor
private string? SourceLayer { get; set; }
private string? Source { get; set; }
public T4SingleSourceProcessor(
public MorskaT4SingleSourceProcessor(
AppDbContext db,
SpreadsheetsResource.ValuesResource googleSheetValues,
ILogger<T4SingleSourceProcessor> logger)
ILogger<MorskaT4SingleSourceProcessor> logger)
{
_db = db;
_googleSheetValues = googleSheetValues;

View File

@@ -6,12 +6,12 @@ using Microsoft.Extensions.Logging;
namespace DiunaBI.Plugins.Morska.Processors;
public class T5LastValuesProcessor : MorskaBaseProcessor
public class MorskaT5LastValuesProcessor : MorskaBaseProcessor
{
public override string ProcessorType => "Morska.Process.T5.LastValues";
private readonly AppDbContext _db;
private readonly ILogger<T5LastValuesProcessor> _logger;
private readonly ILogger<MorskaT5LastValuesProcessor> _logger;
// Configuration properties loaded from layer records
private int Year { get; set; }
@@ -19,9 +19,9 @@ public class T5LastValuesProcessor : MorskaBaseProcessor
private string? SourceLayer { get; set; }
private string? Source { get; set; }
public T5LastValuesProcessor(
public MorskaT5LastValuesProcessor(
AppDbContext db,
ILogger<T5LastValuesProcessor> logger)
ILogger<MorskaT5LastValuesProcessor> logger)
{
_db = db;
_logger = logger;

View File

@@ -829,7 +829,7 @@ public class LayersController : Controller
x.Records!.Any(y => y.Code == "Type" && y.Desc1 == "ImportWorker") &&
x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") &&
!x.IsDeleted && !x.IsCancelled
);
).Take(5);
// If specific layerId is provided, filter to that layer only
if (layerId.HasValue)
@@ -935,7 +935,7 @@ public class LayersController : Controller
x.Records!.Any(y => y.Code == "Type" && y.Desc1 == "ProcessWorker") &&
x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") &&
!x.IsDeleted && !x.IsCancelled
);
).Take(5);
// If specific layerId is provided, filter to that layer only
if (layerId.HasValue)
@@ -966,6 +966,7 @@ public class LayersController : Controller
foreach (var processWorker in processWorkerLayers)
{
// POPRAWIONE: Używaj Plugin zamiast ProcessorType
var pluginName = processWorker.Records!.FirstOrDefault(x => x.Code == "Plugin")?.Desc1;
if (string.IsNullOrEmpty(pluginName))
{
@@ -974,20 +975,12 @@ public class LayersController : Controller
continue;
}
var processorType = processWorker.Records!.FirstOrDefault(x => x.Code == "ProcessorType")?.Desc1;
if (string.IsNullOrEmpty(processorType))
{
_logger.LogWarning("EnqueueProcessWorkers: No processor type found for layer {LayerName} ({LayerId}), skipping",
processWorker.Name, processWorker.Id);
continue;
}
// Check if processor exists
var processor = _pluginManager.GetProcessor(processorType);
// POPRAWIONE: Sprawdź czy processor istnieje przez pluginName
var processor = _pluginManager.GetProcessor(pluginName);
if (processor == null)
{
_logger.LogWarning("EnqueueProcessWorkers: Processor {ProcessorType} not found for layer {LayerName} ({LayerId}), skipping",
processorType, processWorker.Name, processWorker.Id);
_logger.LogWarning("EnqueueProcessWorkers: Processor {PluginName} not found for layer {LayerName} ({LayerId}), skipping",
pluginName, processWorker.Name, processWorker.Id);
continue;
}
@@ -1003,7 +996,7 @@ public class LayersController : Controller
{
LayerId = processWorker.Id,
LayerName = processWorker.Name ?? "Unknown",
PluginName = processorType, // Use processorType as PluginName for process jobs
PluginName = pluginName, // POPRAWIONE: Używaj pluginName bezpośrednio
JobType = JobType.Process,
Priority = priority,
MaxRetries = 3,
@@ -1014,8 +1007,8 @@ public class LayersController : Controller
await _queueService.EnqueueJobAsync(job);
queuedCount++;
_logger.LogDebug("EnqueueProcessWorkers: Queued process job for layer {LayerName} ({LayerId}) with processor {ProcessorType}, priority {Priority}",
processWorker.Name, processWorker.Id, processorType, priority);
_logger.LogDebug("EnqueueProcessWorkers: Queued process job for layer {LayerName} ({LayerId}) with plugin {PluginName}, priority {Priority}",
processWorker.Name, processWorker.Id, pluginName, priority);
}
var totalQueueSize = await _queueService.GetQueueCountAsync();
@@ -1065,8 +1058,16 @@ public class LayersController : Controller
_logger.LogInformation("RunQueueJobs: Triggering queue processing for {QueueSize} jobs", queueSize);
// PRZYWRÓĆ SINGLETON ACCESS:
var queueProcessor = HttpContext.RequestServices.GetRequiredService<JobQueueProcessor>();
// ZMIEŃ NA DOSTĘP PRZEZ IHostedService:
var hostedServices = HttpContext.RequestServices.GetServices<IHostedService>();
var queueProcessor = hostedServices.OfType<JobQueueProcessor>().FirstOrDefault();
if (queueProcessor == null)
{
_logger.LogError("RunQueueJobs: JobQueueProcessor not found");
return BadRequest("JobQueueProcessor not found");
}
queueProcessor.TriggerProcessing();
return Ok(new

View File

@@ -71,9 +71,10 @@ builder.Services.AddAuthentication(options =>
// Queue services
builder.Services.AddScoped<IJobQueueService, JobQueueService>();
builder.Services.AddSingleton<JobQueueProcessor>();
builder.Services.AddHostedService<JobQueueProcessor>(); // ✅ GOOD - with proper scope factory
// Google Sheets dependencies
Console.WriteLine("Adding Google Sheets dependencies...");
builder.Services.AddSingleton<GoogleSheetsHelper>();
builder.Services.AddSingleton<GoogleDriveHelper>();
builder.Services.AddSingleton<SpreadsheetsResource.ValuesResource>(provider =>

View File

@@ -1,3 +1,3 @@
###
GET http://localhost:5400/api/Layers/AddPriorityRecords
GET http://localhost:5400/api/Layers/RunQueueJobs/10763478CB738D4ecb2h76g803478CB738D4e