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 public class JobQueueProcessor : BackgroundService
{ {
private readonly IServiceProvider _serviceProvider; private readonly IServiceScopeFactory _scopeFactory; // ✅ GOOD - używa scope factory
private readonly ILogger<JobQueueProcessor> _logger; 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( public JobQueueProcessor(
IServiceProvider serviceProvider, IServiceScopeFactory scopeFactory, // ✅ GOOD - inject scope factory
ILogger<JobQueueProcessor> logger) ILogger<JobQueueProcessor> logger)
{ {
_serviceProvider = serviceProvider; _scopeFactory = scopeFactory;
_logger = logger; _logger = logger;
_processSignal = new ManualResetEventSlim(false);
} }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@@ -36,19 +39,18 @@ public class JobQueueProcessor : BackgroundService
{ {
try try
{ {
// Wait for manual trigger or cancellation // Wait for manual trigger
_processSignal.Wait(stoppingToken); _processSignal.Wait(stoppingToken);
_processSignal.Reset(); _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 queueService = scope.ServiceProvider.GetRequiredService<IJobQueueService>();
var pluginManager = scope.ServiceProvider.GetRequiredService<PluginManager>();
// Process all jobs until queue is empty await ProcessQueueAsync(queueService, pluginManager, stoppingToken);
await ProcessAllJobs(queueService, stoppingToken);
_logger.LogInformation("JobQueueProcessor: Manual processing completed");
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
@@ -57,8 +59,8 @@ public class JobQueueProcessor : BackgroundService
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "JobQueueProcessor: Unexpected error in queue processor"); _logger.LogError(ex, "JobQueueProcessor: Error in processing loop");
await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken); await Task.Delay(5000, stoppingToken); // Wait before retry
} }
} }
@@ -71,7 +73,7 @@ public class JobQueueProcessor : BackgroundService
_processSignal.Set(); _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 startTime = DateTime.UtcNow;
var initialQueueSize = await queueService.GetQueueCountAsync(); 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})", _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); 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 dbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var pluginManager = scope.ServiceProvider.GetRequiredService<PluginManager>(); var pluginManager = scope.ServiceProvider.GetRequiredService<PluginManager>();
var queueService = scope.ServiceProvider.GetRequiredService<IJobQueueService>(); 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}", _logger.LogError(ex, "JobQueueProcessor: Error processing {JobType} job {JobId} for layer {LayerName}",
job.JobType, job.Id, job.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>(); var queueService = scope.ServiceProvider.GetRequiredService<IJobQueueService>();
// Check if it's a retriable error // Check if it's a retriable error

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,12 +6,12 @@ using Microsoft.Extensions.Logging;
namespace DiunaBI.Plugins.Morska.Processors; namespace DiunaBI.Plugins.Morska.Processors;
public class T5LastValuesProcessor : MorskaBaseProcessor public class MorskaT5LastValuesProcessor : MorskaBaseProcessor
{ {
public override string ProcessorType => "Morska.Process.T5.LastValues"; public override string ProcessorType => "Morska.Process.T5.LastValues";
private readonly AppDbContext _db; private readonly AppDbContext _db;
private readonly ILogger<T5LastValuesProcessor> _logger; private readonly ILogger<MorskaT5LastValuesProcessor> _logger;
// Configuration properties loaded from layer records // Configuration properties loaded from layer records
private int Year { get; set; } private int Year { get; set; }
@@ -19,9 +19,9 @@ public class T5LastValuesProcessor : MorskaBaseProcessor
private string? SourceLayer { get; set; } private string? SourceLayer { get; set; }
private string? Source { get; set; } private string? Source { get; set; }
public T5LastValuesProcessor( public MorskaT5LastValuesProcessor(
AppDbContext db, AppDbContext db,
ILogger<T5LastValuesProcessor> logger) ILogger<MorskaT5LastValuesProcessor> logger)
{ {
_db = db; _db = db;
_logger = logger; _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 == "Type" && y.Desc1 == "ImportWorker") &&
x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") && x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") &&
!x.IsDeleted && !x.IsCancelled !x.IsDeleted && !x.IsCancelled
); ).Take(5);
// If specific layerId is provided, filter to that layer only // If specific layerId is provided, filter to that layer only
if (layerId.HasValue) 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 == "Type" && y.Desc1 == "ProcessWorker") &&
x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") && x.Records!.Any(y => y.Code == "IsEnabled" && y.Desc1 == "True") &&
!x.IsDeleted && !x.IsCancelled !x.IsDeleted && !x.IsCancelled
); ).Take(5);
// If specific layerId is provided, filter to that layer only // If specific layerId is provided, filter to that layer only
if (layerId.HasValue) if (layerId.HasValue)
@@ -966,6 +966,7 @@ public class LayersController : Controller
foreach (var processWorker in processWorkerLayers) foreach (var processWorker in processWorkerLayers)
{ {
// POPRAWIONE: Używaj Plugin zamiast ProcessorType
var pluginName = processWorker.Records!.FirstOrDefault(x => x.Code == "Plugin")?.Desc1; var pluginName = processWorker.Records!.FirstOrDefault(x => x.Code == "Plugin")?.Desc1;
if (string.IsNullOrEmpty(pluginName)) if (string.IsNullOrEmpty(pluginName))
{ {
@@ -974,20 +975,12 @@ public class LayersController : Controller
continue; continue;
} }
var processorType = processWorker.Records!.FirstOrDefault(x => x.Code == "ProcessorType")?.Desc1; // POPRAWIONE: Sprawdź czy processor istnieje przez pluginName
if (string.IsNullOrEmpty(processorType)) var processor = _pluginManager.GetProcessor(pluginName);
{
_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);
if (processor == null) if (processor == null)
{ {
_logger.LogWarning("EnqueueProcessWorkers: Processor {ProcessorType} not found for layer {LayerName} ({LayerId}), skipping", _logger.LogWarning("EnqueueProcessWorkers: Processor {PluginName} not found for layer {LayerName} ({LayerId}), skipping",
processorType, processWorker.Name, processWorker.Id); pluginName, processWorker.Name, processWorker.Id);
continue; continue;
} }
@@ -1003,7 +996,7 @@ public class LayersController : Controller
{ {
LayerId = processWorker.Id, LayerId = processWorker.Id,
LayerName = processWorker.Name ?? "Unknown", LayerName = processWorker.Name ?? "Unknown",
PluginName = processorType, // Use processorType as PluginName for process jobs PluginName = pluginName, // POPRAWIONE: Używaj pluginName bezpośrednio
JobType = JobType.Process, JobType = JobType.Process,
Priority = priority, Priority = priority,
MaxRetries = 3, MaxRetries = 3,
@@ -1014,8 +1007,8 @@ public class LayersController : Controller
await _queueService.EnqueueJobAsync(job); await _queueService.EnqueueJobAsync(job);
queuedCount++; queuedCount++;
_logger.LogDebug("EnqueueProcessWorkers: Queued process job for layer {LayerName} ({LayerId}) with processor {ProcessorType}, priority {Priority}", _logger.LogDebug("EnqueueProcessWorkers: Queued process job for layer {LayerName} ({LayerId}) with plugin {PluginName}, priority {Priority}",
processWorker.Name, processWorker.Id, processorType, priority); processWorker.Name, processWorker.Id, pluginName, priority);
} }
var totalQueueSize = await _queueService.GetQueueCountAsync(); var totalQueueSize = await _queueService.GetQueueCountAsync();
@@ -1065,8 +1058,16 @@ public class LayersController : Controller
_logger.LogInformation("RunQueueJobs: Triggering queue processing for {QueueSize} jobs", queueSize); _logger.LogInformation("RunQueueJobs: Triggering queue processing for {QueueSize} jobs", queueSize);
// PRZYWRÓĆ SINGLETON ACCESS: // ZMIEŃ NA DOSTĘP PRZEZ IHostedService:
var queueProcessor = HttpContext.RequestServices.GetRequiredService<JobQueueProcessor>(); 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(); queueProcessor.TriggerProcessing();
return Ok(new return Ok(new

View File

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