Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
///
/// </summary>
/// <seealso cref="TransactionProcessing.SchedulerService.Jobs.BaseBoostrapper" />
public class GenerateFileUploadsBootstrapper : BaseBoostrapper
public class GenerateFileUploadsJobBootstrapper : BaseBoostrapper
{
#region Methods

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
///
/// </summary>
/// <seealso cref="TransactionProcessing.SchedulerService.Jobs.BaseBoostrapper" />
public class GenerateTransactionsBootstrapper : BaseBoostrapper
public class GenerateTransactionsJobBootstrapper : BaseBoostrapper
{
#region Methods

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
namespace TransactionProcessing.SchedulerService.Jobs
{
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using SecurityService.Client;
using SecurityService.DataTransferObjects.Responses;
Expand All @@ -19,7 +18,7 @@ public class ProcessSettlementJob : IJob

public ProcessSettlementJob(Func<String, IBootstrapper> bootstrapperResolver)
{
this.Bootstrapper = bootstrapperResolver(nameof(GenerateTransactionsJob));
this.Bootstrapper = bootstrapperResolver(nameof(ProcessSettlementJob));
}

/// <summary>
Expand Down Expand Up @@ -67,23 +66,4 @@ public async Task Execute(IJobExecutionContext context)
}
}
}

public class ProcessSettlementBootstrapper : BaseBoostrapper
{
#region Methods

/// <summary>
/// Configures the service additional.
/// </summary>
/// <param name="jobExecutionContext">The job execution context.</param>
public override void ConfigureServiceAdditional(IJobExecutionContext jobExecutionContext)
{
this.Services.AddSingleton<ISecurityServiceClient, SecurityServiceClient>();
this.Services.AddSingleton<ITransactionProcessorClient, TransactionProcessorClient>();

this.Services.AddSingleton<Func<String, String>>(container => serviceName => { return jobExecutionContext.MergedJobDataMap.GetString(serviceName); });
}

#endregion
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace TransactionProcessing.SchedulerService.Jobs
{
using System;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using SecurityService.Client;
using TransactionProcessor.Client;

public class ProcessSettlementJobBootstrapper : BaseBoostrapper
{
#region Methods

/// <summary>
/// Configures the service additional.
/// </summary>
/// <param name="jobExecutionContext">The job execution context.</param>
public override void ConfigureServiceAdditional(IJobExecutionContext jobExecutionContext)
{
this.Services.AddSingleton<ISecurityServiceClient, SecurityServiceClient>();
this.Services.AddSingleton<ITransactionProcessorClient, TransactionProcessorClient>();

this.Services.AddSingleton<Func<String, String>>(container => serviceName => { return jobExecutionContext.MergedJobDataMap.GetString(serviceName); });
}

#endregion
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public static IHostBuilder CreateHostBuilder(string[] args)
webBuilder.UseConfiguration(config);
webBuilder.UseKestrel();
}).ConfigureSilkierQuartzHost();

return hostBuilder;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:64450",
"sslPort": 0
}
},
"profiles": {
"SilkierQuartz.Example": {
"TransactionProcessing.SchedulerService": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:5000"
"applicationUrl": "http://localhost:9501/quartz"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,64 @@
namespace TransactionProcessing.SchedulerService
{
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Jobs;
using Jobs.GenerateTransactions;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Quartz;
using Quartz.Impl;
using SilkierQuartz;

/// <summary>
///
/// </summary>
public class Startup
{
#region Fields

/// <summary>
/// The job bootstrappers
/// </summary>
private readonly List<(String name, IBootstrapper instance)> JobBootstrappers = new List<(String, IBootstrapper)>();

#endregion

#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="Startup"/> class.
/// </summary>
/// <param name="webHostEnvironment">The web host environment.</param>
public Startup(IWebHostEnvironment webHostEnvironment)
{
//this.Configuration = configuration;
IConfigurationBuilder builder = new ConfigurationBuilder().SetBasePath(webHostEnvironment.ContentRootPath)
.AddJsonFile("/home/txnproc/config/appsettings.json", true, true)
.AddJsonFile($"/home/txnproc/config/appsettings.{webHostEnvironment.EnvironmentName}.json",
optional:true).AddJsonFile("appsettings.json", optional:true, reloadOnChange:true)
.AddJsonFile($"appsettings.{webHostEnvironment.EnvironmentName}.json",
optional:true,
reloadOnChange:true).AddEnvironmentVariables();

Startup.Configuration = builder.Build();
Startup.WebHostEnvironment = webHostEnvironment;

var connectionString = Startup.Configuration.GetConnectionString("SchedulerReadModel");
Startup.AddOrUpdateConnectionString("SchedulerReadModel", connectionString);
}

#endregion

#region Properties

/// <summary>
/// Gets or sets the configuration.
/// </summary>
Expand All @@ -30,30 +75,23 @@ public class Startup
/// </value>
public static IWebHostEnvironment WebHostEnvironment { get; set; }

public Startup(IWebHostEnvironment webHostEnvironment)
{
//this.Configuration = configuration;
IConfigurationBuilder builder = new ConfigurationBuilder().SetBasePath(webHostEnvironment.ContentRootPath)
.AddJsonFile("/home/txnproc/config/appsettings.json", true, true)
.AddJsonFile($"/home/txnproc/config/appsettings.{webHostEnvironment.EnvironmentName}.json", optional: true)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{webHostEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
#endregion

Startup.Configuration = builder.Build();
Startup.WebHostEnvironment = webHostEnvironment;

var connectionString = Configuration.GetConnectionString("SchedulerReadModel");
AddOrUpdateConnectionString("SchedulerReadModel", connectionString);
}
#region Methods

public static void AddOrUpdateConnectionString(string name, string connectionString)
/// <summary>
/// Adds the or update connection string.
/// </summary>
/// <param name="name">The name.</param>
/// <param name="connectionString">The connection string.</param>
public static void AddOrUpdateConnectionString(String name,
String connectionString)
{
try
{
var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var settings = configFile.ConnectionStrings.ConnectionStrings;
Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConnectionStringSettingsCollection settings = configFile.ConnectionStrings.ConnectionStrings;

if (settings[name] == null)
{
settings.Add(new ConnectionStringSettings(name, connectionString));
Expand All @@ -62,16 +100,23 @@ public static void AddOrUpdateConnectionString(string name, string connectionStr
{
settings[name].ConnectionString = connectionString;
}

configFile.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}
catch (ConfigurationErrorsException)
catch(ConfigurationErrorsException)
{
Console.WriteLine("Error writing connection string");
}
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
/// <summary>
/// Configures the specified application.
/// </summary>
/// <param name="app">The application.</param>
/// <param name="env">The env.</param>
public void Configure(IApplicationBuilder app,
IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
Expand All @@ -88,52 +133,71 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseAuthorization();
app.UseSilkierQuartz();

app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
}



/// <summary>
/// Configures the services.
/// </summary>
/// <param name="services">The services.</param>
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<Func<String, IBootstrapper>>(container => (type) =>
services.AddSingleton<Func<String, IBootstrapper>>(container => type =>
{
switch (type)
{
case "GenerateTransactionsJob":
return new GenerateTransactionsBootstrapper();
case "GenerateFileUploadsJob":
return new GenerateFileUploadsBootstrapper();
case "ProcessSettlementJob":
return new ProcessSettlementBootstrapper();
}

return null;
(String name, IBootstrapper instance) bootstrapper =
this.JobBootstrappers.SingleOrDefault(b => b.name == $"{type}Bootstrapper");
return bootstrapper.instance;
});

services.AddRazorPages();

services.AddSingleton<GenerateTransactionsJob>();
services.AddSingleton<GenerateFileUploadsJob>();
services.AddSingleton<ProcessSettlementJob>();

services.AddSilkierQuartz(s =>
{
s.VirtualPathRoot = "/quartz";
s.UseLocalTime = true;
s.DefaultDateFormat = "yyyy-MM-dd";
s.DefaultTimeFormat = "HH:mm:ss";
s.Scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;

},
a =>
{
a.AccessRequirement = SilkierQuartzAuthenticationOptions.SimpleAccessRequirement.AllowAnonymous;
});
this.RegisterJobBootstrappers();
this.RegisterJobs(services);

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;

services.AddSilkierQuartz(s =>
{
s.VirtualPathRoot = "/quartz";
s.UseLocalTime = true;
s.DefaultDateFormat = "yyyy-MM-dd";
s.DefaultTimeFormat = "HH:mm:ss";
s.Scheduler = scheduler;
},
a => { a.AccessRequirement = SilkierQuartzAuthenticationOptions.SimpleAccessRequirement.AllowAnonymous; });
}

/// <summary>
/// Registers the job bootstrappers.
/// </summary>
private void RegisterJobBootstrappers()
{
IEnumerable<Type> jobs = typeof(IBootstrapper).GetTypeInfo().Assembly.DefinedTypes
.Where(t => typeof(IBootstrapper).GetTypeInfo().IsAssignableFrom(t.AsType()) && t.IsClass &&
t.IsAbstract == false).Select(p => p.AsType());

foreach (Type job in jobs)
{
Object instance = Activator.CreateInstance(job);
this.JobBootstrappers.Add((job.Name, (IBootstrapper)instance));
}
}

/// <summary>
/// Registers the jobs.
/// </summary>
/// <param name="services">The services.</param>
private void RegisterJobs(IServiceCollection services)
{
Type type = typeof(IJob);
IEnumerable<Type> jobs = AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(p => type.IsAssignableFrom(p) && p.IsInterface == false);

foreach (Type job in jobs)
{
services.AddSingleton(job);
}
}

#endregion
}
}