Naming fix
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
|
||||
|
||||
@@ -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 =>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
###
|
||||
GET http://localhost:5400/api/Layers/AddPriorityRecords
|
||||
GET http://localhost:5400/api/Layers/RunQueueJobs/10763478CB738D4ecb2h76g803478CB738D4e
|
||||
|
||||
|
||||
Reference in New Issue
Block a user