From ed1064f3a4ff6924cd42b1d546fa51c7a1e79e11 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Wed, 3 May 2023 12:57:55 +0100 Subject: [PATCH] Added Support Report Job --- .../JobTestDriver/JobTestDriver.csproj | 14 ++ .../JobTestDriver/Program.cs | 32 +++ .../Bootstrapper.cs | 7 +- .../GenerateFileUploadsJob.cs | 14 +- .../GenerateMerchantStatementJob.cs | 22 +- .../GenerateTransactionsJob.cs | 28 +-- .../Jobs.cs | 200 ++++++++++++++++++ .../ProcessSettlementJob.cs | 2 +- .../SupportReportEmailJob.cs | 38 ++++ ...ionProcessing.SchedulerService.Jobs.csproj | 6 + ...TransactionProcessing.SchedulerService.sln | 7 + 11 files changed, 319 insertions(+), 51 deletions(-) create mode 100644 TransactionProcessing.SchedulerService/JobTestDriver/JobTestDriver.csproj create mode 100644 TransactionProcessing.SchedulerService/JobTestDriver/Program.cs create mode 100644 TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs create mode 100644 TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/SupportReportEmailJob.cs diff --git a/TransactionProcessing.SchedulerService/JobTestDriver/JobTestDriver.csproj b/TransactionProcessing.SchedulerService/JobTestDriver/JobTestDriver.csproj new file mode 100644 index 0000000..78daeda --- /dev/null +++ b/TransactionProcessing.SchedulerService/JobTestDriver/JobTestDriver.csproj @@ -0,0 +1,14 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + diff --git a/TransactionProcessing.SchedulerService/JobTestDriver/Program.cs b/TransactionProcessing.SchedulerService/JobTestDriver/Program.cs new file mode 100644 index 0000000..79435e3 --- /dev/null +++ b/TransactionProcessing.SchedulerService/JobTestDriver/Program.cs @@ -0,0 +1,32 @@ +namespace JobTestDriver +{ + using MessagingService.Client; + using TransactionProcessing.SchedulerService.Jobs; + + internal class Program{ + static async Task Main(string[] args){ + //List<(String groupName, String streamName, Int64 parkedMessageCount)>? info = await Jobs.GetParkedQueueInformation("esdb://admin:changeit@192.168.0.133:2113?tls=false&tlsVerifyCert=false", CancellationToken.None); + //foreach ((String groupName, String streamName, Int64 parkedMessageCount) infoItem in info){ + // Console.WriteLine($"Group: {infoItem.groupName} Stream: {infoItem.streamName} Parked Count: {infoItem.parkedMessageCount}"); + //} + + //List<(Guid, String, DateTime, String)>? incompleteFiles = await Jobs.GetIncompleteFileList("server=192.168.0.133;user id=sa;password=Sc0tland;database=EstateReportingReadModel;Encrypt=True;TrustServerCertificate=True", CancellationToken.None); + //foreach ((Guid, String, DateTime, String) incompleteFile in incompleteFiles){ + // Console.WriteLine($"FileId: {incompleteFile.Item1} Location: {incompleteFile.Item2} Rcvd: {incompleteFile.Item3} Merchant: {incompleteFile.Item4}"); + //} + HttpClient client = new HttpClient(); + IMessagingServiceClient messagingServiceClient = new MessagingServiceClient(delegate(String s){ return "http://127.0.0.1:5006";}, client); + String accessToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQzOUMxRDk5MDUwQTYyMDhEM0U5M0JFMjlBQUJBNzI5IiwidHlwIjoiYXQrand0In0.eyJpc3MiOiJodHRwczovLzEyNy4wLjAuMTo1MDAxIiwibmJmIjoxNjgzMTA2NDE2LCJpYXQiOjE2ODMxMDY0MTYsImV4cCI6MTY4MzExMDAxNiwiYXVkIjpbImVzdGF0ZU1hbmFnZW1lbnQiLCJlc3RhdGVSZXBvcnRpbmciLCJmaWxlUHJvY2Vzc29yIiwibWVzc2FnaW5nU2VydmljZSIsInRyYW5zYWN0aW9uUHJvY2Vzc29yIiwidHJhbnNhY3Rpb25Qcm9jZXNzb3JBQ0wiLCJ2b3VjaGVyTWFuYWdlbWVudCIsImh0dHBzOi8vMTI3LjAuMC4xOjUwMDEvcmVzb3VyY2VzIl0sInNjb3BlIjpbImVzdGF0ZU1hbmFnZW1lbnQiLCJlc3RhdGVSZXBvcnRpbmciLCJmaWxlUHJvY2Vzc29yIiwibWVzc2FnaW5nU2VydmljZSIsInRyYW5zYWN0aW9uUHJvY2Vzc29yIiwidHJhbnNhY3Rpb25Qcm9jZXNzb3JBQ0wiLCJ2b3VjaGVyTWFuYWdlbWVudCJdLCJjbGllbnRfaWQiOiJzZXJ2aWNlQ2xpZW50IiwianRpIjoiMDZBMUI4NzYyRjFGNDJGNkIwMzM5RTYwRTk2MkVDQkUifQ.G5pFWRJF430ZZxnGO_yIxEC6Zj81LRr3HNq6d8V9EV4Pswp5YO7hZ867Ln4mjnrYag4lGI4cpT5S6646r9KNdZMiLOsdQs2LEJPuUjEdVADIwm8rcdqT8OX-sC6uGA6VL0bMmYWQXw1E8d4kax444I6jeNquLjpoWVD1BDp9L1zzC6e_k9W7Fc9MQOogOqO82TXrBl9nkpBbmJQ0HDiub2yVUTUKLwkCeRfBDlyeU8tyNE7kH6IGdHIL_WYUtiiRYjBJ2PNLzTtrXQk4rqw6GB-25K2qcgP5FO0MI675tAkuPKI0DaySXHnAjYssW8wZYy0tkaJL0OIlmOUe-9jM6g"; + await Jobs.SendSupportEmail(DateTime.Now, + accessToken, + "esdb://admin:changeit@192.168.0.133:2113?tls=false&tlsVerifyCert=false", + "server=192.168.0.133;user id=sa;password=Sc0tland;database=EstateReportingReadModel;Encrypt=True;TrustServerCertificate=True", + new List{ + "435613ac-a468-47a3-ac4f-649d89764c22" + }, + messagingServiceClient, + CancellationToken.None); + + } + } +} \ No newline at end of file diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Bootstrapper.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Bootstrapper.cs index 687694e..d985864 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Bootstrapper.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Bootstrapper.cs @@ -7,6 +7,7 @@ using DataGeneration; using EstateManagement.Client; using EstateManagement.DataTransferObjects.Responses; +using MessagingService.Client; using Microsoft.Extensions.DependencyInjection; using Quartz; using SecurityService.Client; @@ -37,6 +38,7 @@ public static void ConfigureServices(IJobExecutionContext jobExecutionContext){ Bootstrapper.Services.AddSingleton(httpClient); Bootstrapper.Services.AddSingleton(); + Bootstrapper.Services.AddSingleton(); Bootstrapper.Services.AddSingleton(); Bootstrapper.Services.AddSingleton(); Bootstrapper.Services.AddSingleton>(container => serviceName => { return jobExecutionContext.MergedJobDataMap.GetString(serviceName); }); @@ -76,9 +78,4 @@ protected async Task GetToken(String clientId, String clientSecret, Canc return token.AccessToken; } - - protected async Task GetMerchant(String accessToken, Guid estateId, Guid merchantId, CancellationToken cancellationToken){ - IEstateClient estateClient = Bootstrapper.GetService(); - return await estateClient.GetMerchant(accessToken, estateId, merchantId, cancellationToken); - } } \ No newline at end of file diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateFileUploadsJob.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateFileUploadsJob.cs index 1a00257..a91e432 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateFileUploadsJob.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateFileUploadsJob.cs @@ -6,6 +6,7 @@ using DataGeneration; using EstateManagement.DataTransferObjects.Responses; using Quartz; + using Quartz.Logging; [DisallowConcurrentExecution] public class GenerateFileUploadsJob : BaseJob, IJob @@ -19,21 +20,10 @@ public async Task Execute(IJobExecutionContext context) String clientSecret = context.MergedJobDataMap.GetString("ClientSecret"); Guid estateId = context.MergedJobDataMap.GetGuidValueFromString("EstateId"); Guid merchantId = context.MergedJobDataMap.GetGuidValueFromString("MerchantId"); - - String accessToken = await this.GetToken(clientId, - clientSecret, - context.CancellationToken); ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live); - MerchantResponse merchant = await this.GetMerchant(accessToken, estateId, merchantId, context.CancellationToken); - - List contracts = await t.GetMerchantContracts(merchant, context.CancellationToken); - DateTime fileDate = DateTime.Now; - foreach (ContractResponse contract in contracts){ - // Generate a file and upload - await t.SendUploadFile(fileDate, contract, merchant, context.CancellationToken); - } + await Jobs.GenerateFileUploads(t, estateId, merchantId, context.CancellationToken); } diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateMerchantStatementJob.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateMerchantStatementJob.cs index d384bd1..1af3a81 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateMerchantStatementJob.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateMerchantStatementJob.cs @@ -1,10 +1,8 @@ namespace TransactionProcessing.SchedulerService.Jobs; using System; -using System.Collections.Generic; using System.Threading.Tasks; using DataGeneration; -using EstateManagement.DataTransferObjects.Responses; using Quartz; public class GenerateMerchantStatementJob : BaseJob, IJob @@ -18,9 +16,21 @@ public async Task Execute(IJobExecutionContext context) ITransactionDataGenerator t = this.CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live); - List merchants = await t.GetMerchants(estateId, context.CancellationToken); - foreach (MerchantResponse merchantResponse in merchants){ - await t.GenerateMerchantStatement(merchantResponse.EstateId, merchantResponse.MerchantId, DateTime.Now, context.CancellationToken); - } + await Jobs.GenerateMerchantStatements(t, estateId, context.CancellationToken); } +} + +public class SupportReportJob : BaseJob, IJob +{ + public async Task Execute(IJobExecutionContext context) + { + Bootstrapper.ConfigureServices(context); + + String eventStoreAddress = context.MergedJobDataMap.GetString("EventStoreAddress"); + String databaseConnectionString = context.MergedJobDataMap.GetString("DatabaseConnectionString"); + + // Events in Parked Queues + // Incomplete Files + } + } \ No newline at end of file diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs index ccdf052..2810238 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs @@ -38,33 +38,7 @@ public async Task Execute(IJobExecutionContext context){ ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live); - // get a token - String accessToken = await this.GetToken(clientId, - clientSecret, - context.CancellationToken); - - // get the merchant - MerchantResponse merchant = await this.GetMerchant(accessToken, estateId, merchantId, context.CancellationToken); - - DateTime transactionDate = DateTime.Now; - - if (requireLogon){ - // Do a logon transaction for the merchant - await t.PerformMerchantLogon(transactionDate, merchant, context.CancellationToken); - } - - // Get the merchants contracts - List contracts = await t.GetMerchantContracts(merchant, context.CancellationToken); - - foreach (ContractResponse contract in contracts){ - // Generate and send some sales - await t.SendSales(transactionDate, merchant, contract, context.CancellationToken); - - // Generate a file and upload - await t.SendUploadFile(transactionDate, contract, merchant, context.CancellationToken); - } - - Console.WriteLine($"Logon sent for Merchant [{merchant.MerchantName}]"); + await Jobs.GenerateTransactions(t, estateId, merchantId, requireLogon, context.CancellationToken); } catch(Exception e){ // TODO: Log the error diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs new file mode 100644 index 0000000..50f4e7c --- /dev/null +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs @@ -0,0 +1,200 @@ +namespace TransactionProcessing.SchedulerService.Jobs; + +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using DataGeneration; +using EstateManagement.DataTransferObjects.Responses; +using EventStore.Client; +using MessagingService.Client; +using MessagingService.DataTransferObjects; +using Microsoft.Data.SqlClient; +using Newtonsoft.Json; + +public static class Jobs{ + public static async Task GenerateMerchantStatements(ITransactionDataGenerator t, Guid estateId, CancellationToken cancellationToken){ + List merchants = await t.GetMerchants(estateId, cancellationToken); + foreach (MerchantResponse merchantResponse in merchants) + { + await t.GenerateMerchantStatement(merchantResponse.EstateId, merchantResponse.MerchantId, DateTime.Now, cancellationToken); + } + } + + public static async Task GenerateFileUploads(ITransactionDataGenerator t, Guid estateId, Guid merchantId, CancellationToken cancellationToken) + { + MerchantResponse merchant = await t.GetMerchant( estateId, merchantId, cancellationToken); + + List contracts = await t.GetMerchantContracts(merchant, cancellationToken); + DateTime fileDate = DateTime.Now; + foreach (ContractResponse contract in contracts) + { + // Generate a file and upload + await t.SendUploadFile(fileDate, contract, merchant, cancellationToken); + } + } + + public static async Task GenerateTransactions(ITransactionDataGenerator t, Guid estateId, Guid merchantId, Boolean requireLogon, CancellationToken cancellationToken) + { + // get the merchant + MerchantResponse merchant = await t.GetMerchant(estateId, merchantId, cancellationToken); + + DateTime transactionDate = DateTime.Now; + + if (requireLogon) + { + // Do a logon transaction for the merchant + await t.PerformMerchantLogon(transactionDate, merchant, cancellationToken); + } + + // Get the merchants contracts + List contracts = await t.GetMerchantContracts(merchant, cancellationToken); + + foreach (ContractResponse contract in contracts) + { + // Generate and send some sales + await t.SendSales(transactionDate, merchant, contract, cancellationToken); + + // Generate a file and upload + await t.SendUploadFile(transactionDate, contract, merchant, cancellationToken); + } + } + + public static async Task PerformSettlement(ITransactionDataGenerator t, DateTime dateTime, Guid estateId, CancellationToken cancellationToken) + { + await t.PerformSettlement(dateTime, estateId, cancellationToken); + } + + public static async Task> GetParkedQueueInformation(String eventStoreConnectionString, CancellationToken cancellationToken){ + EventStoreClientSettings clientSettings = EventStoreClientSettings.Create(eventStoreConnectionString); + EventStore.Client.EventStorePersistentSubscriptionsClient client = new EventStorePersistentSubscriptionsClient(clientSettings); + List<(String groupName, String streamName, Int64 parkedMessageCount)> result = new List<(String groupName, String streamName, Int64 parkedMessageCount)>(); + IEnumerable x = await client.ListAllAsync(cancellationToken:cancellationToken); + foreach (PersistentSubscriptionInfo persistentSubscriptionInfo in x){ + if (persistentSubscriptionInfo.Stats.ParkedMessageCount > 0){ + // Add to replay list + result.Add((persistentSubscriptionInfo.GroupName, persistentSubscriptionInfo.EventSource, persistentSubscriptionInfo.Stats.ParkedMessageCount)); + } + } + + return result; + } + + public static async Task> GetIncompleteFileList(String databaseConnectionString,CancellationToken cancellationToken){ + List<(Guid, String, DateTime, String)> result = new List<(Guid, String, DateTime, String)>(); + + using (SqlConnection connection = new SqlConnection(databaseConnectionString)){ + await connection.OpenAsync(cancellationToken); + + SqlCommand command = connection.CreateCommand(); + command.CommandText = "select FileId, FileLocation, FileReceivedDateTime, merchant.Name from [file] f inner join merchant on merchant.MerchantId = f.MerchantId where IsCompleted= 0"; + command.CommandType = CommandType.Text; + + var reader = await command.ExecuteReaderAsync(cancellationToken); + + while (await reader.ReadAsync(cancellationToken)){ + + var fileId = reader.GetGuid(0); + var fileLocation = reader.GetString(1); + var fileReceivedDateTime = reader.GetDateTime(2); + var merchantName = reader.GetString(3); + + result.Add((fileId, fileLocation, fileReceivedDateTime, merchantName)); + } + } + + return result; + } + + public static SendEmailRequest BuildSupportEmail(DateTime dateTime, + List<(Guid fileId, String fileLocation, DateTime fileReceivedDateTime, String merchantName)> incompleteFiles, + List<(String groupName, String streamName, Int64 parkedMessageCount)> parkedQueueInformation) + { + // Build uo the HTML String + StringBuilder htmlBuilder = new StringBuilder(); + + htmlBuilder.AppendLine(""); + htmlBuilder.AppendLine(""); + htmlBuilder.AppendLine(""); + htmlBuilder.AppendLine(""); + + htmlBuilder.AppendLine(""); + + htmlBuilder.AppendLine($"

Daily Support Report for {dateTime.ToString("dd-MM-yyyy")}

"); + + htmlBuilder.AppendLine("

Parked Messages Stats

"); + + if (parkedQueueInformation.Any() == false){ + htmlBuilder.AppendLine("

No Data

"); + } + else{ + htmlBuilder.AppendLine(""); + htmlBuilder.Append(""); + + foreach ((String groupName, String streamName, Int64 parkedMessageCount) info in parkedQueueInformation){ + htmlBuilder.Append($""); + } + + htmlBuilder.AppendLine("
GroupStreamParked Messages
{info.groupName}{info.streamName}{info.parkedMessageCount}
"); + } + + htmlBuilder.AppendLine("

Incomplete Bulk Files

"); + + if (incompleteFiles.Any() == false) + { + htmlBuilder.AppendLine("

No Data

"); + } + else + { + htmlBuilder.AppendLine(""); + htmlBuilder.Append(""); + + foreach ((Guid fileId, String fileLocation, DateTime fileReceivedDateTime, String merchantName) incompleteFile in incompleteFiles){ + + htmlBuilder.Append($""); + } + + htmlBuilder.AppendLine("
IdLocationFile ReceivedMerchant Name
{incompleteFile.fileId}{incompleteFile.fileLocation}{incompleteFile.fileReceivedDateTime}{incompleteFile.merchantName}
"); + } + + htmlBuilder.AppendLine(""); + htmlBuilder.AppendLine(""); + + SendEmailRequest request = new SendEmailRequest{ + Body = htmlBuilder.ToString(), + ConnectionIdentifier = Guid.NewGuid(), + FromAddress = "support@transactionprocessing.com", + IsHtml = true, + MessageId = Guid.NewGuid(), + Subject = $"Daily Support Report for {dateTime:dd-MM-yyyy}", + ToAddresses = new List{ + "stuart_ferguson1development@outlook.com" + } + }; + return request; + } + + public static async Task SendSupportEmail(DateTime dateTime, + String accessToken, + String eventStoreConnectionString, String databaseConnectionString, List estateIds, + IMessagingServiceClient messagingServiceClient, + CancellationToken cancellationToken) + { + List<(String groupName, String streamName, Int64 parkedMessageCount)> parkedQueueInfo = await Jobs.GetParkedQueueInformation(eventStoreConnectionString, cancellationToken); + List<(Guid, String, DateTime, String)> incompleteFiles = new List<(Guid, String, DateTime, String)>(); + foreach (String estateId in estateIds){ + String connectionString = databaseConnectionString.Replace("", estateId.ToString()); + incompleteFiles.AddRange(await GetIncompleteFileList(connectionString, cancellationToken)); + } + + SendEmailRequest emailRequest = BuildSupportEmail(dateTime, incompleteFiles, parkedQueueInfo); + emailRequest.ConnectionIdentifier = Guid.Parse(estateIds.First()); + await messagingServiceClient.SendEmail(accessToken, emailRequest, CancellationToken.None); + } +} \ No newline at end of file diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/ProcessSettlementJob.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/ProcessSettlementJob.cs index 8c66b07..3b60f98 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/ProcessSettlementJob.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/ProcessSettlementJob.cs @@ -24,7 +24,7 @@ public async Task Execute(IJobExecutionContext context) ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live); - await t.PerformSettlement(DateTime.Now.Date, estateId, context.CancellationToken); + await Jobs.PerformSettlement(t, DateTime.Now, estateId, context.CancellationToken); } } } diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/SupportReportEmailJob.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/SupportReportEmailJob.cs new file mode 100644 index 0000000..48acbe7 --- /dev/null +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/SupportReportEmailJob.cs @@ -0,0 +1,38 @@ +namespace TransactionProcessing.SchedulerService.Jobs; + +using System; +using System.Linq; +using System.Threading.Tasks; +using MessagingService.Client; +using Quartz; + +public class SupportReportEmailJob : BaseJob, IJob +{ + #region Methods + public async Task Execute(IJobExecutionContext context) + { + Bootstrapper.ConfigureServices(context); + + String clientId = context.MergedJobDataMap.GetString("ClientId"); + String clientSecret = context.MergedJobDataMap.GetString("ClientSecret"); + String eventStoreConnectionString = context.MergedJobDataMap.GetString("EventStoreConnectionString"); + String databaseConnectionString = context.MergedJobDataMap.GetString("DatabaseConnectionString"); + String estateIds = context.MergedJobDataMap.GetString("EstateIds"); + + String token = await this.GetToken(clientId, clientSecret, context.CancellationToken); + + IMessagingServiceClient messagingServiceClient = Bootstrapper.GetService(); + + await Jobs.SendSupportEmail(DateTime.Now, + token, + eventStoreConnectionString, + databaseConnectionString, + estateIds.Split(',').ToList(), + messagingServiceClient, + context.CancellationToken); + } + + + + #endregion +} \ No newline at end of file diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj index 067eb64..73a30b0 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/TransactionProcessing.SchedulerService.Jobs.csproj @@ -6,6 +6,12 @@ + + + + + + diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.sln b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.sln index b80a899..0b9dc19 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.sln +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.sln @@ -11,6 +11,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0131F226-313 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{8EBAA9CC-7C39-497D-A925-866E68CFE20A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JobTestDriver", "JobTestDriver\JobTestDriver.csproj", "{B7C455B1-F86A-41CD-91D6-DC041FC83B27}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -25,6 +27,10 @@ Global {0A8E0EA7-3A93-4605-A690-C663F6239099}.Debug|Any CPU.Build.0 = Debug|Any CPU {0A8E0EA7-3A93-4605-A690-C663F6239099}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A8E0EA7-3A93-4605-A690-C663F6239099}.Release|Any CPU.Build.0 = Release|Any CPU + {B7C455B1-F86A-41CD-91D6-DC041FC83B27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7C455B1-F86A-41CD-91D6-DC041FC83B27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7C455B1-F86A-41CD-91D6-DC041FC83B27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7C455B1-F86A-41CD-91D6-DC041FC83B27}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -32,6 +38,7 @@ Global GlobalSection(NestedProjects) = preSolution {FCFCFE63-02D6-4CA3-947C-3E51DFE4389C} = {0131F226-313F-4F7C-9576-7AA726FA9584} {0A8E0EA7-3A93-4605-A690-C663F6239099} = {0131F226-313F-4F7C-9576-7AA726FA9584} + {B7C455B1-F86A-41CD-91D6-DC041FC83B27} = {8EBAA9CC-7C39-497D-A925-866E68CFE20A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {FCE31FDA-32E8-49AB-8D30-0D36D461CBC1}