diff --git a/ECMJobRunner.WebCron/ECMJobRunner.WebCron.csproj b/ECMJobRunner.WebCron/ECMJobRunner.WebCron.csproj
index 5419ef0..3c386f4 100644
--- a/ECMJobRunner.WebCron/ECMJobRunner.WebCron.csproj
+++ b/ECMJobRunner.WebCron/ECMJobRunner.WebCron.csproj
@@ -7,7 +7,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ECMJobRunner.WebCron/Program.cs b/ECMJobRunner.WebCron/Program.cs
index a55475f..a718986 100644
--- a/ECMJobRunner.WebCron/Program.cs
+++ b/ECMJobRunner.WebCron/Program.cs
@@ -1,10 +1,57 @@
+using ECMJobRunner.Application;
+using ECMJobRunner.Infrastructure;
using ECMJobRunner.WebCron;
+using Hangfire;
+using Hangfire.SqlServer;
+using Microsoft.Data.SqlClient;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
-builder.Services.AddHostedService();
+builder.Services.AddHostedService();
+
+// Register services
+var cnnStr = builder.Configuration.GetConnectionString("SDD-VMP04-SQL17")
+ ?? throw new InvalidOperationException("Connection string 'SDD-VMP04-SQL17' not found.");
+builder.Services.AddJobRunnerInfrastructure(cnnStr);
+
+var recClientApiUrl = builder.Configuration.GetValue("ReC:ApiUrl")
+ ?? throw new InvalidOperationException("ReC:ApiUrl not found.");
+builder.Services.AddJobRunnerServices(recClientApiUrl);
+
+// Get Hangfire storage configuration
+var useInMemory = builder.Configuration.GetValue("Hangfire:InMemory");
+
+// Add Hangfire services with configurable storage
+builder.Services.AddHangfire(configuration =>
+{
+ configuration
+ .SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
+ .UseSimpleAssemblyNameTypeSerializer()
+ .UseRecommendedSerializerSettings();
+
+ // Configure storage based on appsettings
+ if (useInMemory)
+ {
+ configuration.UseInMemoryStorage();
+ }
+ else // Use SQL Server storage
+ {
+ configuration.UseSqlServerStorage(cnnStr, new SqlServerStorageOptions
+ {
+ CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
+ SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
+ QueuePollInterval = TimeSpan.Zero,
+ UseRecommendedIsolationLevel = true,
+ DisableGlobalLocks = true,
+ SqlClientFactory = SqlClientFactory.Instance
+ });
+ }
+});
+
+// Add Hangfire server
+builder.Services.AddHangfireServer();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
@@ -22,6 +69,12 @@ app.UseHttpsRedirection();
app.UseAuthorization();
+// Add Hangfire Dashboard with no authentication (for development)
+app.UseHangfireDashboard("/hangfire", new DashboardOptions
+{
+ Authorization = new[] { new AllowAllDashboardAuthorizationFilter() }
+});
+
app.MapControllers();
app.Run();
diff --git a/ECMJobRunner.WebCron/Properties/launchSettings.json b/ECMJobRunner.WebCron/Properties/launchSettings.json
index 337539e..2d26522 100644
--- a/ECMJobRunner.WebCron/Properties/launchSettings.json
+++ b/ECMJobRunner.WebCron/Properties/launchSettings.json
@@ -13,7 +13,7 @@
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- "launchUrl": "swagger",
+ "launchUrl": "hangfire",
"applicationUrl": "http://localhost:5271",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
@@ -23,7 +23,7 @@
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- "launchUrl": "swagger",
+ "launchUrl": "hangfire",
"applicationUrl": "https://localhost:7027;http://localhost:5271",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
@@ -32,7 +32,7 @@
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
- "launchUrl": "swagger",
+ "launchUrl": "hangfire",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
diff --git a/ECMJobRunner.WebCron/Worker.cs b/ECMJobRunner.WebCron/Worker.cs
deleted file mode 100644
index 4c1fcec..0000000
--- a/ECMJobRunner.WebCron/Worker.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace ECMJobRunner.WebCron
-{
- public class Worker : BackgroundService
- {
- private readonly ILogger _logger;
-
- public Worker(ILogger logger)
- {
- _logger = logger;
- }
-
- protected override async Task ExecuteAsync(CancellationToken stoppingToken)
- {
- while (!stoppingToken.IsCancellationRequested)
- {
- if (_logger.IsEnabled(LogLevel.Information))
- {
- _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
- }
- await Task.Delay(1000, stoppingToken);
- }
- }
- }
-}
diff --git a/ECMJobRunner.WebCron/appsettings.json b/ECMJobRunner.WebCron/appsettings.json
index 10f68b8..c0565e2 100644
--- a/ECMJobRunner.WebCron/appsettings.json
+++ b/ECMJobRunner.WebCron/appsettings.json
@@ -5,5 +5,14 @@
"Microsoft.AspNetCore": "Warning"
}
},
- "AllowedHosts": "*"
+ "ConnectionStrings": {
+ "SDD-VMP04-SQL17": "Server=SDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=dd;Encrypt=false;TrustServerCertificate=True;"
+ },
+ "AllowedHosts": "*",
+ "Hangfire": {
+ "InMemory": true
+ },
+ "ReC": {
+ "ApiUrl": "http://172.24.12.39:90"
+ }
}